第13章 HLSL基础

来源:互联网 发布:jetbrains java ide 编辑:程序博客网 时间:2024/05/07 05:12

  在XNA之前,DirectX允许开发者直接把指令送到图形设备,通过一个叫固定功能管线的机制(FFP)。一段时间内这工作得很好,直到图形卡和硬件变得难以置信的复杂。

  通过使用HLSL,开发者能够访问图形卡的所有功能而不必使用一个如FFP的API。

  在HLSL,开发者写能访问最复杂的图形硬件功能的着色器。图形卡能支持两种不同种类的着色器:顶点着色器和像素着色器。定点着色器为视椎体或视域中的每个顶点运行一次;像素着色器在场景中绘制的每个可见物体的每个可见像素上运行一次。

HLSL语法

  HLSL是一种类C语言。在HLSL中编写着色器与XNA中编程非常不同。如果你不能明白它和感到迷茫,不要太在意。

  swizzling(数据的组合赋值)

细心研究一个HLSL效果文件样例

  在XNA中,效果在效果文件中创建,带有.fx扩展名。

  当在XNA中用HLSL文件时,第一件事就是要寻找哪些变量需要通过XNA代码来设置。

  像你用C或C++编程一样,在HLSL中,变量和函数需要在使用之前定义。这以为一个HLSL文件的典型流程是变量在顶部,接着是结构体函数,最后是着色器调用本身。

  每一个HLSL文件会有一个或更多个技术。在你的XNA代码中,当应用一个HLSL文件时,你要具体指定哪个技术运行,通过引用它的名字。

  在technique块内部,有一个子块叫通道。每个技术有一个或更多个通道。当你在XNA中用一个自定义的HLSL文件绘制时,你会设定技术,然后在所有的通道中循环以绘制出每一个通道。

  每个通道能包含一个顶点和(或)像素着色器。为了实现一个着色器,你的HLSL文件必须设定VertexShader和(或)PixelShader对象的值等于一个编译过的顶点或像素着色器函数。

  VertexShader和PixelShader对象是HLSL对象。

  下面看看顶点着色器函数

   HLSL语义被用来连接XNA程序中正在使用HLSL代码的数据。在Position变量上指定POSITION0语义促使HLSL自动设置那个由XNA程序提供的变量为一个位置值。自动赋的值就是顶点的位置。

  对于顶点着色器合法的输入语义有:

  BINORMAL[n]

  BLENDINDICES[n]

  BLENDWEIGHT[n]

  COLOR[n]

  NORMAL[n]

  POSITION[n]

  POSITIONT

  PSIZE[n]

  TANGENT[n]

  TEXCOORD[n]

  语义的意思改变取决于该语义是否是用在顶点着色器或像素着色器中,是否被指定为输入或输出。

  对于顶点着色器合法的输出语义:

  COLOR[n]

  FOG

  POSITION[n]

  PSIZE

 TESSFACTOR[n]

 TEXCOORD[n]

 

 

 ●没有给定语义或初始值的全局变量需由XNA代码设置。

 ●在你的HLSL文件中运行的技术名需由XNA代码设置。

 ●一个带语义的输入参数会自动地接收那个语义表示的数据,当HLSL效果执行时。

 ●一个待语义的输出变量标志出了该变量在效果中用于特定数据处理。

 ●一个顶点着色器对于输入和输出有不同的语义。

 ●一个顶点着色器最少都需要指定一个POSITION[n]语义用于输出。

 

合法的像素着色器输入语义:

COLOR[n]

TEXCOORD[n]

VFACE

VPOS

 合法的像素着色器输出语义:

  COLOR[n]

  DEPTH[n]

 

 

原创粉丝点击