位置: 编程技术 - 正文

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

  • 企业向股东借款个人所得税
  • 个税要计提吗?
  • 个人所得税如何办理退税
  • 年终奖怎么计税的
  • 资产负债表中的固定资产是原值还是净值
  • 去年的电费可以在今年入账分录
  • 出口关税的计算基数
  • 增值税包括哪些内容
  • 发票上有字迹可以拿去作废吗
  • 生产经营年度汇缴申报时间
  • 自行建造固定资产中的自营工程,在领用工程物资
  • 机动车换车
  • 建筑施工企业质量体系环境包括
  • 待摊费用是
  • 事业单位结转资金和结余资金区别
  • 公司商务卡可以日常消费
  • 购买税控设备,享受何种优惠政策
  • 增值税税负多少算高
  • 增值税专用发票的税率是多少啊
  • 960011115金税盘错误
  • 付现金可以开专用发票吗
  • 个税返还手续费入什么科目
  • 高速公路过路费查询网站
  • 场地维修属于什么费用
  • 税收分类编码选错会怎样
  • win10系统升级软件
  • 台式电脑机箱怎么选
  • 购买礼品的会计科目
  • phpstorm如何运行
  • phpstudy的ftp
  • 增值税进项税抵扣销项税
  • windows10记事本
  • 仓储费计入存货成本吗
  • 现金流量科目怎么设置
  • 冷漠的渡鸦们,美国阿拉斯加州 (© Brian Browitt Photo/Adobe Stock)
  • 无线路由器wifi指示灯不亮
  • 在vue3项目中自定义组件通常存放在
  • php目录列表
  • 企业发放年终奖政府有哪些规定?
  • 现金返利分录
  • vue使用jquery
  • 前端面试题必问的题目
  • 车船税每年都要多少钱
  • 研发支出放在资产负债表哪里
  • 境外捐赠入账
  • SQLite中的WAL机制详细介绍
  • 预开发票后涨价如何进行账务处理?
  • 人员经费指的是
  • 医院能开增值发票吗
  • 股权转让会计分录借银行存款
  • 经济纠纷引发的盗窃
  • 收到政府补助的会计分录
  • 非在职人员和其他人员的区别
  • 销售完一定要结工资吗
  • 体检费用开发票给公司怎么开
  • 减免税款月末是否结平
  • 盈余公积的构成
  • 数据库账号密码怎么修改
  • ubuntu 操作系统
  • telnet root
  • linux操作系统的发行版本有哪些
  • linux 配置中文
  • linux常用命令cat
  • linux检测硬件
  • js原生实现ajax
  • div与span区别及用法
  • node.js快速入门
  • unity自带的ui叫什么
  • 获取控件的值
  • 使用粗盐热敷十大危害
  • linux tar -zxf
  • jqueryui easyui
  • python append 浅拷贝
  • android studio i使用
  • python动态加载py
  • 面向对象的知识
  • 低保大数据核查哪些数据
  • 宣城市有什么好玩的景区
  • 南宁税务局进面分数线
  • 浙江税务开票系统
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设