The Complete Effect and HLSL Guide(十一)
本文版权归原作者所有,仅供个人学习使用,请勿转载,勿用于任何商业用途。
由于本人水平有限,难免出错,不清楚的地方请大家以原著为准。欢迎大家和我多多交流。
翻译:clayman
Blog:http://blog.csdn.net/soilwork
clayman_joe@yahoo.com.cn
第四章 Shader示例
上一章里,我们详细讨论了HLSL着色语言的各方面。但并没有实际展示如何编写shader。虽然本书不是关于如何编写shader的,但还是有必要编写几个简单的shader,帮你深入了解HLSL。此外,在学习effect framework时,我们还会用到这些例子来阐述一些核心概念。
记住,对创建一个完整的shader来说,不仅仅是编写shader代码,还包括用适当的语义符设置一系列渲染状态和变量。当然,由于目前你还缺乏编写完整shader的一些知识,所以,这里只讨论前者:也就是顶点和像素着色程序代码。本书的后面会对这些代码进行扩展。
最简单的Shader
对于把物体渲染到屏幕上来说,有几个基本的步骤是必须完成的。首先,需要接收输入顶点的位置(顶点在世界坐标中的位置)并把它们转变为屏幕坐标。通常使用world-view-projection矩阵来完成这个任务,它包含了把顶点从局部坐标映射为最终屏幕坐标的所有信息。现在开始,我们假设已经有这样一个矩阵变量,并且名称为view_proj_matrix。
先来定义一个把数据从顶点着色器传递给像素着色器的结构。我们把这个结构称为VS_OUTPUT,当然,也可以是任何你喜欢的名字。目前,只需要把顶点位置数据添加到这个结构中。
struct VS_OUTPUT
{
float4 Pos: POSITION;
};
你应该注意到我们把POSITION语义连接到了Pos变量上,它将告诉effect系统如何把这个变量传递到像素着色器中。我会在下一章讲解语义。现在只差顶点着色器代码了。顶点着色器接收顶点位置,并使用view_proj_matrix矩阵对它进行变换,可以用内建的mul函数来完成这一步计算。我们把顶点着色器代码放到一个名为vs_main的函数中:
VS_OUTPUT vs_main ( float4 inPos : POSITION)