位置: 编程技术 - 正文

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()函数理解

  • 所得税可以弥补几年
  • 增值税不用交还要计提吗
  • 其他应收款审计说明怎么写
  • 企业捐赠灾区
  • 发票勾选平台怎么导出未勾选的发票
  • 暂估发票一直未收回
  • 抬头 个人
  • 误餐费没有发票怎么说明
  • 计提房租的会计科目
  • 企业收到票据背书转让给其他公司怎么做会计处理?
  • 其他综合收益包含哪些科目
  • 代收房款
  • 金蝶财务软件如何打印凭证
  • 无形资产摊销金额计入什么科目
  • 减免所得税额和抵免所得税额的区别
  • 收到测试费几分钱如何做账
  • 小规模纳税人咨询服务费的税率是多少
  • 增值税的调增调减
  • 出口退税申报里汇率计算方式选择
  • 软件开发公司研发主管绩效考核
  • 到期一次付息债券的实际利率怎么算
  • windows 10纯净版
  • 生产企业销售给其他单位的生产工具
  • itunes无法链接
  • mac dns 设置
  • mac系统如何开启任何来源
  • 一般纳税人增值税税率
  • 隐藏分区怎么打开
  • 成本法转为权益法属于会计政策变更吗
  • 外贸出口退税企业差旅费可以抵扣吗
  • win10蓝牙共享网络给手机
  • PHP:shell_exec()的用法_命令行函数
  • 化妆品与药品
  • 开发商延期交房违法吗
  • php的implode
  • 福利部门领用原材料进项税额可以抵扣吗
  • 大雾山国家公园在哪里
  • 即征即退增值税怎么申报
  • 机票报账行程单怎么打印
  • transformerss
  • python集合的并集符号语言
  • vue笔记大全
  • 定额发票和增值税发票
  • 营改增后残保金计入什么科目
  • 未取得增值税发票开具二手车发票
  • 土地增值税可以抵扣吗
  • 国际运输代理费属于什么科目
  • sql存储过程几个主要步骤
  • 差旅费报销相关政策
  • mysql终端操作
  • 小规模纳税人差额征税
  • 建安企业费用有哪些
  • 现金流量表是年度报表
  • 房地产业营改增税收政策与企业应对策略课后测试
  • 代扣代缴附加税怎么做账
  • 以旧换新会计科目
  • 技术服务费怎么做分录
  • 库存商品用于投资
  • 汽车行业的财务会计
  • 公司租的房子电费发票怎么开
  • 如何判断企业处于什么阶段
  • 金税盘费用不交会怎么样
  • 预支款怎么做现金账
  • 代办营业执照安全可靠吗
  • mysql的基础知识
  • win7 系统启动
  • WIN10系统如何彻底永久关闭自动更新?建议收藏!
  • 进程cmd.exe
  • 怎么让微软账户获得所有权限
  • cocos2d-x windows开发环境配置
  • Linux中获取某个进程的系统调用以及参数(故障排查案例)
  • async/await与promise(nodejs中的异步操作问题)
  • js插件大全
  • 获取路径下的文件名
  • androidstudio如何放大代码
  • 北京税务局网上怎么登录
  • 补充耕地指标费用能从储备中心支付吗
  • 上海工资8000税后多少
  • 村纪检书记主要工作
  • 房山税收减免政策文件
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设