首页 > 代码库 > 三维渲染引擎设计与实践(六)
三维渲染引擎设计与实践(六)
6.2纹理与纹理属性
6.2.1纹理的实现方法
纹理是一个数组的概念,其中每一个数据(RGB颜色以及Alpha值,或者其他系统及用户定义的类型)称作一个纹素(texel)。
每一个映射通道称为一个纹理单元。
对于场景中的节点或几何体应用纹理属性时,通常需要预先指定每个顶点的纹理坐标,以便将图像正确贴至物体上。只有几何体可以设置纹理坐标,因此在设置节点的纹理之前,必须得到该节点子树中所有的几何体对象并设置他们的纹理坐标。 geom->setCoordArray()
Texture作为各种纹理表达方式的基类,保存了一些通用的属性和方法,包括纹理的滤波方式(Fliter)、边界处的截取方式(Clamp)、明细层次(Mipmaps)
记录二维图像源的image类。
6.2.2纹理的分类
二维纹理,Texture2D;一维纹理,Texture1D;三维纹理,Texture3D可以理解为多层二维纹理所构成的一个立方体,而其中每一个纹素此时成为称为一个体素(voxel)。立方图纹理主要用于反射贴图或环境贴图的表达。
场景中的纹理设置;纹理的明细层次,
6.3属性的实现与访问
6.3.1将属性应用到场景
渲染属性(StateAttribute),包括纹理(Texture)以及其他OpenGL属性,其实现的关键均在于StateAttribute::apply()
6.3.2渲染状态集回调
类似于节点和可绘制体的回调机制,osg的渲染状态集也有更新和事件的回调结构,用于场景每一帧更新的过程中,或者产生人机交互事件时,自动调用用户子自定义的回调。osg::StateSet setUpdateCallback setEventCallback
6.4OSG着色语言
GLSL采用类似C语言的词法和语法格式,可编程图形处理器,顶点着色器、片元着色器和几何着色器。
顶点着色器可以用于替代顶点和法线变换、纹理坐标生成和变换、光照以及材质应用这些传统的管线命令;片元着色器用于替代纹理应用、雾化和像素汇总的工作;几何着色器则可以在图元装配过程中重新生成新的图元。
program类,是stateattribute的派生类,设置到一个节点或可绘制物体上,从而将着色器绑定到制定的场景对象。
shawder类,封装了顶点着色器、片元着色器和几何着色器的代码加载和编译功能。
uniform类,是着色器一致变量的接口类,一致变量使用户程序与着色器的主要交互接口。
7.1场景的观察与变换
(1)模型视点变换。
经过模型视点变换后,即可认为场景从世界坐标系转变到了相机坐标系(view coordinate system 眼坐标系)。nuv为vcs坐标系中的三个分量。
(2)投影变换
意味着之前已经变换到相机坐标系vcs的场景再次变换到投影坐标系。格式化设备坐标系(normalized device coordinate system NDCS)
(3)视口变换
是将投影变换得到的结果反映到指定的屏幕窗口上。窗口坐标系(Device Coordinate System,DCS设备坐标系)。
7.1.2相机节点
模型变换矩阵,由局部对象坐标系变为世界坐标系 Mmodel
视点变换矩阵又称观察矩阵,由世界坐标系变换到相机坐标系Mview
投影矩阵和窗口矩阵,合并为MVPW矩阵,实现三维场景向二维平面的映射,
相机节点osg::Camera派生自Transforml类, 保存了大量相机设置参数,例如视口、投影矩形、背景颜色等
camera->addChild(node)
7.2图形设备接口
camera的setGraphicsContext()函数的工作是设置相机对应的图形设备对象。
7.2.2窗口与像素缓存
7.2.3渲染到纹理 P192
三维渲染引擎设计与实践(六)