物体着色的基础 --- 四种不同光照作用
1、环境反射
近似的模拟了场景中的全局辐射,也就是用来近似模拟所有光在场景中不断散射的结果。材质中有相应的属性来代表这种环境反射颜色。
2、漫反射
这种颜色是接收到直接从光源发射的光之后产生的,“漫反射”和现实中的意思一样,就是描述光被物体反射到多个方向的效果。
3、放射
指的是自发光物体所拥有的颜色。具体意思就是放射光只能照亮自己却不能对周围任何物体产生影响。这种光很奇怪的,现实中没有的。
4、镜面反射
描述了物体对被光照后的“高光”效果。这个也比较抽象。
纹理贴图(Texture Mapping)
可以用程序把纹理通过一个独立的坐标系映射到一个物体上。
可编程着色技术(Programmable Shading)
Ogre支持所有风格的GPU着色语言,其中包括低级的汇编和诸如Cg,GLSL和HLSL这种高级语言。
批次(Batching)
Ogre最基本的渲染单元被称为可渲染对象(Renderable),它们通过不同的渲染状态被分类传递到渲染队列中去。而一次渲染状态的改变就是一个批次。
材质克隆
在Ogre中材质是被所有引用所共享的。所以同一时刻可能有多个指针指向同一个材质,如果每个指针都有状态变化,那只能自己克隆一份材质,单独处理。
GPU着色
GPU(图形处理器)在设计之初就有着明确的目标,提供高性能的并行向量计算以供针对3D图形处理使用。GPU的存在是为了减少CPU(中央处理器)的工作压力,使用者负责分配具体的计算工作给它们。因此,需要有计划再在设计中的管线加入可编程着色技术,尤其是当将要计划使用实时阴影技术或者更高级的渲染到纹理(Render-to-Texture)技术的时候更需要这方面的支援。
材质的例子
最简单的Ogre材质可定义如下:
1 material VerySimple//材质 2 { 3 technique//技术 4 { 5 pass//通道 6 { 7 diffuse 0.5 0.5 0.5 // 8 } 9 } 10 }
当然也可以加上纹理贴图:
material Examples/EnvMappedRustySteel
{
technique//技术
{
pass
{
texture_unit Diffuse//纹理贴图1
{
texture RustySteel.jpg//纹理图片
}
texture_unit Environment//纹理贴图2
{
texture spheremap.png//纹理图片
colour_op_ex add src_texture src_current
colour_op_multipass_fallback one one
env_map spherical
}
}
}
}
纹理覆盖(Texture Aliases)
在很多情况下,派生材质的目的可能只是需要改变已有脚本中的纹理图片。这时候可以通过简单的纹理覆盖机制来实现。代码实现如下:
1 material Examples/EnvMappedCompressedRustySteel : Examples/EnvMappedRustySteel 2 { 3 set_texture_alias Diffuse rustySteel.dds // 4 set_texture_alias Environment aphereMap.dds// 5 }