位置: 编程技术 - 正文

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

  • 税盘服务费抵扣增值税
  • 汇算清缴银行手续费
  • 发债评级机构 有哪些
  • 科技公司技术服务费计入什么科目
  • 合同上怎么注明开具6%的含税普通发票
  • 应交增值税减免税款
  • 发出商品的会计核算
  • 融资租赁业务的账务处理
  • 当期处置子公司,当期还纳入合报范围嘛
  • 发票上盖财务章吗
  • 存货转固定资产的时点
  • 运输公司赔偿计入什么科目
  • 银行借款的利息支出属于什么会计要素
  • 企业计提预提费用的会计分录如何编制?
  • 银行结算方式包括哪些内容
  • 房产税逾期有滞纳金吗
  • 劳务税能不能抵扣
  • 银行承兑汇票盖章错误证明
  • 工会开发票有税号吗?
  • 非居民企业取得股息红利企业所得税
  • 以现金形式发放的员工餐费补贴,可并入职工福利费
  • 在建工程转固定资产当月提折旧吗?
  • 分公司发生修理费能否在总公司列支?
  • 员工罚款可以从工资里扣吗
  • win7系统中文乱码怎么解决
  • php字符串函数有哪些
  • windows10版本2004怎么样
  • 前端项目中遇到的最大困难,怎么解决的
  • 电脑fs0是什么
  • 机动处置什么意思
  • 未确认融资费用怎么算
  • 退回以前年度多交的附加税怎么做分录
  • php中include_once
  • super命令linux
  • 最新预提房租会计分录
  • 企业支付给其他单位劳务费时需要代扣代缴个税吗
  • 销售净额等于净利润吗
  • access china
  • 一万元,两分的利息,一年利息是多少
  • 费用报销单的经办人是什么意思
  • 收到法人投资款需要什么手续
  • 固定资产清理的含义
  • 金融资产主要包括
  • 可转换公司债券名词解释
  • 存货 跌价
  • 长期借款账务处理会计分录
  • 计提本月应交增值税
  • 原材料暂估的业务包括
  • 电子银行承兑汇票能拆票吗
  • 以前年度损益调整借贷方向
  • 财务月末暂估成本是什么
  • 医药企业研发费用构成
  • 建账是不是只需要科目余额表
  • 投资管理工作内容
  • 浅谈基于comsol的锂离子电池仿真
  • sqlserver数据库事物日志已满
  • dos命令环境
  • win10选择软件打开方式
  • win7 双击不能打开文件
  • win7 更新
  • win8系统怎么搜索文件
  • mac safari浏览历史
  • win8 boot manager
  • 升级win10免费吗
  • win7 ctrl+alt+del
  • 快速批量取关
  • 电脑没有声音了是怎么回事
  • js代码执行顺序简单介绍
  • script_tool_for_windows.bat Windows 环境下的 hosts 一键部署脚本
  • 给div设置滚动条
  • bootstrap和jsp
  • nodejs初始化
  • nodejs web3
  • 安卓网络编程面试题
  • shell命令for
  • unity gpu优化
  • jquerygrid
  • javascript运用
  • 小规模纳税人网上申报
  • 四川增值税发票查验平台
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设