Ogre 着色器

先说一句,所谓着色器,就是指那些在渲染时,可以为显卡加载的程序。类似于脚本吧。

书接上回

渲染的第一步是,顶点坐标从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 矩阵相乘
}

猜你喜欢

转载自tuo-ba-ye.iteye.com/blog/2042760