位置: 编程技术 - 正文

OpenGL教程翻译 第十七课 环境光(Ambient Lighting)(opengl英文)

编辑:rootadmin

推荐整理分享OpenGL教程翻译 第十七课 环境光(Ambient Lighting)(opengl英文),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:opengl perspective,opengl中文教程,opengl英文,opengl gltranslatef,opengl英文,opengl英文,opengl gltranslatef,opengl translate,内容如对您有帮助,希望把文章链接给更多的朋友!

OpenGL教程翻译 第十七课 环境光(Ambient Lighting)

原文地址: ambient intensity--环境光强度

在本次的教程代码实例中你可以通过按“A和“S”键来增加或者减小环境光的强度,观察在对在之前的教程中创建的纹理金字塔的影响。这只是平行光的环境光的部分,而其方向的因素还没有涉及。在下一章我们学习漫反射光时将会改变。现在你看到无论你在哪里看金字塔,它的亮度都相同。

很多人认为要尽量避免环境光,因为它看起来有些虚假,而且其简单的实现方式对于场景的真实性也没有太大的贡献。通过使用先进的方法例如全局照明,我们可以消除对环境光的需求,因为(使用全局照明)从物体反射出来而照射到其他对象的光一样可以被考虑。因为我们还没有那么深入,你通常需要一些少量的环境光,以避免物体的一面被照亮而另外一个面完全黑暗。天色渐晚的时候,为了使光看起来更好,我们需要进行大量的调整参数和协调工作。

Code Walkthru

随着时间的推移,我们的代码样本变得越来越复杂,而且这种趋势仍会持续。在本节教程中,除了实现环境光,我们也对代码做了大规模重构。我们将会把以后章节的代码放在一个更好的位置。主要改变如下:

1.将着色器的管理封装到Technique类中,包括编译和链接等操作。从现在开始我们将通过从Technique类派生的类实现视觉效果。

2.将GLUT初始化和callback管理移动到GLUTBacked组件中。这个组件注册自己来接收来自GLUT的callback调用并通过名为ICallbacks的C&#;&#;接口把他们发送给应用。

3.将全局变量和main cpp文件中的变量移动到一个可被看做是“应用类”的类中。以后我们将把它扩展成一个为所有应用提供常用功能的基类。这种方法在许多的游戏引擎和框架中很受欢迎。

这个教程中的大多数的代码(除了光照中特定的代码)并不是新的,而仅仅是根据以上的设计原则的重新布局,因此只对新的头文件进行说明。

(glut_backend.h:)

OpenGL教程翻译 第十七课 环境光(Ambient Lighting)(opengl英文)

void GLUTBackendInit(int argc, char** argv);bool GLUTBackendCreateWindow(unsigned intWidth, unsigned int Height, unsigned int bpp, bool isFullScreen, const char*pTitle);

GLUT很多特定的代码都被移动到一个叫做"GLUT backend"的组件,这个组件使我们能更容易的进行GLUT的初始化和使用上面的GLUTBackendCreateWindow函数创建窗口。

(glut_backend.h:)

void GLUTBackendRun(ICallbacks* pCallbacks);

在初始化GLUT和创建窗口后,下一步是使用上面的封装函数执行GLUT 主循环。在这里新增加的ICallbacks接口对注册GLUT回调函数有所帮助。相对于让每一个application本身注册callbacks,GLUT backend组件注册自己的私有函数,并且将事件传送给上面函数调用所指定的对象。main application类通常会自行实现此接口,并在调用GLUTBackendRun时把自己作为一个参数传进去。在之前的教程中编译和链接着色器的所有的苦差事都是应用程序的一部分责任。technique类通过自身封装常用功能而使得派生类能集中精力于实现核心效果(又名“Technique”)。每一个technique首先必须通过调用Init()函数初始化。派生的technique必须调用基类的Init()(用来创建OpenGL程序对象),并且可以在这里添加自己私有的初始化。在创建和初始化technique对象之后,接下来通常让派生technique类对所有需要的GLSL着色器(在字符数组中提供)调用受保护的函数AddShader()。最后,Finalize()用于链接对象。Enable()实际上是glUseProgram()的封装,所以无论何时切换technique和调用绘制函数时都要调用它。这个类跟踪中间级的编译对象,并且在链接之后使用glDeleteShader()将他们删除。这有助于减少你的应用程序消耗的资源。为了实现更好的性能,OpenGL应用程序通常在加载时编译所有的着色器,而不是在运行的时候。通过在链接后立即移除对象,有助于你的应用保持OpenGL资源低消耗。程序对象本身使用glDeleteProgram()在析构函数中删除。这是main应用类的架构,封装了我们已经熟悉的代码。Init()负责创建效果、加载纹理和创建顶点/索引缓存。Run()调用GLUTBackendRun()并且把对象本身作为一个参数传递。因为这个类实现了ICallbacks接口,所以所有的GULT事件以类中适当的方法结束。此外,所有以前文件全局部分定义的变量现在都是这个类的私有属性。

(lighting_technique.h:)

struct DirectionalLight{ Vector3f Color; float AmbientIntensity;};

这是平行光定义的开始。目前为止,只有环境光部分存在,而平行光本身还未涉及。当我们在下一个教程复习漫反射光时我们将会增加平行光。在这个结构中包括两个方面—颜色和环境光强度。颜色决定了对象的哪些颜色通道以何种强度可以被反射回来。例如,如果颜色是(1.0, 0.5, 0.0),那么之后对象的红色通道将会得到充分的反射,绿色通道将会被缩减到一半,蓝色通道将会被完全丢掉。这是因为一个对象只能反射入射光(光源不同——他们反射的光需要分开处理)。对于太阳光的颜色通常是纯粹的白色(1.0, 1.0, 1.0)。

AmbientIntensity指出了光的昏暗或明亮程度。强度1.0,你可以获得纯粹的白色,那样的话对象将被充分的照亮,或者定义为0.1,那样的话对象可见但是看起来非常的暗。这是technique类的使用的第一个例子,LightingTechnique是一个派生类,通过使用基类提供的编译和链接常用功能而实现照明。在创建对象后必须调用Init()函数,它仅仅调用Technique::AddShader()和Techique::Finalize()来生成GLSL程序 在本章中顶点着色器保持不变,它接着传递位置(在将它乘以WVP矩阵之后)和纹理坐标。所有的新的逻辑都进入片元着色器。在这里新增的内容是用 “struct” 关键字定义平行光。正如你看到的,这个关键字和在C/C&#;&#;中的使用方法几乎一样。这个结构体和我们在应用程序代码中一样,而且我们必须这样,以使应用程序和着色器就可以交流。现在有一个新的DirectionalLight类型的一致变量需要由应用更新。这个变量用于像素最终颜色的计算。和以前一样,我们对材质取样得到基本颜色。然后按上述的公式我们把它与颜色和环境光强度相乘。这总结了环境光的计算。

(lighting_technique.cpp:)

m_WVPLocation = GetUniformLocation("gWVP");m_samplerLocation = GetUniformLocation("gSampler");m_dirLightColorLocation= =GetUniformLocation("gDirectionalLight.Color");m_dirLightAmbientIntensityLocation= =GetUniformLocation("gDirectionalLight.AmbientIntensity");

为了在application中获取平行光一致变量,你必须独立得到他的两个组分的位置。LightingTechnique类有4个GLuint位置变量,为了在顶点和片元着色器中获得一致变量。。WVP和sampler的位置以我们熟悉的方式获得。颜色和环境光强度用上面我们看到的方式获得——通过指定着色器中的一致变量的名字,后面跟随一个点,然后是在结构本身的组分的名字。设置这些变量的&#;的方式和设置其他变量一样。LightingTechnique类提供了两种方法来设置平行光和WVP矩阵。第章中的类在每次调用绘制命令前之前先调用他们以更新这些&#;。

这章你可以分别使用“a”和“s”键来增强和减弱环境光强度。按照在Tutorial类中的KeyboardCB()函数来看是如何完成的。

OpenGl的glMatrixMode()函数理解 glMatrixMode()函数的参数,这个函数其实就是对接下来要做什么进行一下声明,也就是在要做下一步之前告诉计算机我要对什么进行操作了,这个什么在glM

OpenGL--分格化 理论基础分格化:OpenGL渲染的都是一些简单的凸多边形,对于那些复杂的多边形,如凹多边形,含孔多边形以及自交叉的多边形,OpenGL函数库不能对他

OpenGL--二次几何体 理论基础二次几何体:就是指一些常用的三维物体,如球体,圆柱体,圆盘和圆锥体等,OpenGL核心库也不能直接模拟和渲染,但我们可以使用GLU库来创

标签: opengl英文

本文链接地址:https://www.jiuchutong.com/biancheng/369591.html 转载请保留说明!

上一篇:OpenG: 光照(opengl光照设置)

下一篇:OpenGl的glMatrixMode()函数理解

  • 固定资产清理应该在年报中怎么填写
  • 一般纳税人申报纳税的流程
  • 资产的计税基础大于账面价值会形成可抵扣的暂时性差异
  • 收到上年度所得税发票
  • 收到社保局退回的社保费
  • 账户利息怎么做账务处理
  • 雇佣外籍劳工
  • 招待用烟的会计处理
  • 工资计提多了怎么冲
  • 车船使用税应该交哪里的税
  • 佣金付给别人公司违法吗
  • 现金折扣 会计处理
  • 股东以实物出资需要交税吗
  • 银行回单手续费怎么找到对应金额
  • 老项目简易征收可以用进项抵扣吗
  • 纳税人财务会计核算办法怎么上传
  • 24个问题
  • 职工教育经费是多少
  • 失控发票进项转出申报
  • 盘亏机器设备会计分录
  • 免税农产品进项抵扣计算
  • 企业接受投资者的土地使用权投资
  • 购进货物无偿赠送其他单位
  • 先发货后开票的销售业务流程
  • 新办企业装修会计分录
  • 无法连接到移动网络小米
  • 暂估收入入账冲回如何会计分录
  • daio.dll 病毒
  • 网络看不到局域网图标
  • 观察者模式 mvc
  • win7纯净版本
  • getcodebase
  • PHP:is_executable()的用法_Filesystem函数
  • 房地产企业销售额扣除土地价款
  • php pdo类
  • 学人工智能哪家机构比较好
  • 使用灭火器时要对准火焰的什么部位喷射
  • php charat
  • 通过点击office文件按钮可以选择设置系统选项
  • 小规模附加税减免性质代码如何选
  • 税收优惠属于政府补助
  • 有什么是即征即退税的
  • 研发支出的主要内容
  • php_fileinfo不支持
  • 异常凭证一定要转出吗
  • 免征增值税的会计处理一般纳税人
  • 劳务公司账务处理实操
  • 工会经费计提基数包括奖金吗
  • 预存返利骗局
  • 在我国土地使用权分为哪几类
  • 资固定资产清理
  • 工会经费的使用应当依法接受国家的监督
  • 行政事业单位固定资产计提折旧
  • 减免税款月末是否结平
  • 租房买的中央空调怎么用
  • 长期待摊费用什么时候结束摊销
  • 外资房地产企业 利润汇出比例
  • 个体工商户达到多少缴税
  • 免激活合法使用的软件
  • docker 自启动
  • Win10虚拟内存怎么转移
  • imac硬盘测试
  • osx10.11.6版本如何
  • ntfs权限设置步骤
  • linux bin和sbin
  • u3d怎么导入贴图
  • FreeGLUT Tips: Resolve compile issue: error LNK1104: cannot open file 'freeglutd.lib'
  • excel最小化后再次选择不弹出来
  • jquery的实现原理
  • 我为什么要
  • 简述javascript执行原理
  • nodejsapi
  • unity3d inspector
  • linux多线程调试手段
  • java 视频教程
  • jquery ajax局部加载方法详解(实现代码)
  • jquery限制字符长度
  • 西安二手房几年可以过户
  • 如何查询税控盘是否注销成功
  • 可转债中签当天扣款吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设