位置: 编程技术 - 正文

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

  • 过路费抵扣进项税填在申报表哪里
  • 跨年取得的发票怎么入账
  • 发票第二年是否可以作废
  • 零星采购不要发票可以吗
  • 购进用于研发的国产设备进项税可以抵扣吗
  • 赠送固定资产会计处理
  • 何为售后租回
  • 外聘人员劳务费入什么科目
  • 加工企业购入辅料记入什么科目?
  • 分配现金股利的现金流
  • 公司内部核算调拨价差的账务怎么做处理?
  • 报企业所得税的利润总额怎么填
  • 销售新的固定资产怎么算
  • 房产增值税征收期限
  • 工会开票是否需要开户银行
  • 印花税按次申报怎么报
  • 集团对子公司投资收益协议
  • 无偿接收股权
  • 工费经费用计提吗
  • 1697508991
  • 螺丝计入什么费用
  • 营收和产值的区别和联系
  • 核定征收印花税计算公式
  • 水电费无发票如何做账
  • 收到承兑汇票会计分录
  • 认缴出资额日期没有是什么意思
  • window10系统有几种
  • 360安全路由器怎么重启
  • PHP:pg_send_query()的用法_PostgreSQL函数
  • 发票已付款未认账怎么办
  • neoCopy.exe - neoCopy是什么进程 有什么用
  • php后端开发流程教程
  • 分享php守护进程失败
  • spring 异常
  • 找潜水员
  • 总分机构 分总机构
  • php sha1加密 解密
  • web 前端
  • 小规模销售收入超过500万
  • 银行日记账更正
  • 公司给买员工保险
  • 复核人和收款人一样了怎么办
  • mongo创建db
  • 公司认缴出资怎么交税
  • 小微企业认定办法
  • 怎么填红字信息表
  • 财务软件属于什么设备
  • access数据保存
  • Ubuntu上安装jdk
  • 报销发票啥意思
  • 物资采购是
  • 应付账款的四大基本要素
  • 营业外收入主要包括( )
  • 未完施工针对的是什么工程
  • 转让技术所有权是其他业务收入吗
  • 企业收到个体户的普通发票还需要缴纳20%的税吗
  • 免费样品的好处
  • 以非货币形式出资应办理什么手续
  • 营业利润包括资本化支出吗
  • 次年发放的奖金怎么入账
  • 换工作时社保公积金怎么办
  • 酒店会计做账流程
  • 物流公司怎么做利润高
  • mysql5718解压版安装
  • unix系统采用什么结构
  • 苹果发布会最新消息
  • wysafe.exe是什么
  • win7 系统设置
  • centos release6.7
  • win8怎么清空电脑只剩系统
  • 关于windows的开始菜单,叙述错误的是
  • win8.1系统升级win10
  • UnityEditor.UI.dll' is in timestamps but is not known in assetdatabase
  • css中清除浮动的目的有哪些
  • Android Studio cvs 状态颜色
  • ubuntu touch教程
  • javascript有几种类型
  • js class实现原理
  • android之startActivityForResult的使用
  • 冲减多计提的坏账准备
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设