书接上回
渲染的第一步是,顶点坐标从local space 转换到 camera space,这里就引出第一种着色器。vertex shaders。其实,vertex shader能控制这个变换过程。
eg
vertex_program MyVertexShader1 cg //vertex_program为关键字,表示顶点着色器。 MyVertexShader1 shader名字。 cg 关键字 表明shader使用cg语言 { source myShaders.cg //定义着色器的脚本文件 entry_point MyVertexShader1 //shader的名字,与脚本中的那个函数名一致 profiles vs_1_1 arbvp1 //shader的版本号 default_params //定义了一个被Ogre 3D自动传给着色器的参数 { param_named_auto worldViewMatrix worldviewproj_matrix //关键字worldviewproj_matrix.这个关键字告诉Ogre 3D我们想要我们的参数拥有WorldViewProjection矩阵的值。 ///局部空间的坐标乘以这个矩阵的,得到的坐标就是摄像机空间的顶点坐标。 } }
渲染的第二、三步是,光栅化和贴图,这里可以加载第二种着色器,fragment shader ,这个着色器,可以控制贴图坐标,映射到模型的坐标。
fragment_program MyFragmentShader1 cg { source myShaders.cg //参数含义同上 entry_point MyFragmentShader1 profiles ps_1_1 arbfp1 }
myShaders.文件如下:
void MyFragmentShader1(out float4 color: COLOR) { color = float4(0,0,1,0); } void MyVertexShader1( float4 position : POSITION, // 由ogre传给此着色器的参数 worldViewMatrix ,即局部空间的位置 out float4 oPosition : POSITION, //变换完之后的位置,即摄像机空间的位置 uniform float4x4 worldViewMatrix)//此参数拥有WorldViewProjection矩阵的值 { oPosition = mul(worldViewMatrix, position);//完成从局部坐标到摄像机坐标的映射,即局部坐标 mul WorldViewProjection矩阵 = 摄像机空间坐标。mul 矩阵相乘 }