Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1350501
  • 博文数量: 281
  • 博客积分: 8800
  • 博客等级: 中将
  • 技术积分: 3346
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-17 22:31
文章分类

全部博文(281)

文章存档

2013年(1)

2012年(18)

2011年(16)

2010年(44)

2009年(86)

2008年(41)

2007年(10)

2006年(65)

我的朋友

分类: LINUX

2009-09-03 10:47:38

第一部分 顶点着色器

什么是顶点着色器?
1 顶点着色器是一组指令代码,这组指令代码在顶点被渲染时执行。
2 同一时间内,只能激活一个顶点着色器。
3 每个源顶点着色器最多拥有128条指令(DirextX8.1),而在DirectX9,则可以达到256条。

为什么大家要使用顶点着色器?
1 顶点着色器可以提高渲染场景速度。
2 用顶点着色器你可以做布类仿真,高级别动画,实时修改透视效果(比如水底效果),高级光亮(需要像素着色器支持)

顶点着色器如何运作?
简单说来,运作方式如下:当渲染一个顶点时,API会执行你在顶点着色器中所写的指令。依靠这种方法,你可以自己控制每个顶点,包括渲染,确定位置,是否显示在屏幕上。

如何创建一个顶点着色器?
用一个文本编辑器就可以了!我建议你们使用notepad或者vs开发环境来创建和修改着色器。另外,必须拥有一个支持可编程着色器的显卡。写完着色器后,保存他。API就可以调用他了(Direct3D或OpenGL)。API通过一些函数来调用这些代码指令到硬件中。


第二部分 像素着色器

什么是像素着色器?
1 像素着色器也是一组指令,这组指令在顶点中像素被渲染时执行。在每个执行时间,都会有很多像素被渲染。(像素的数目依靠屏幕的分辨率决定)
2像素着色器的指令和顶点着色器的指令非常接近。像素着色器不能像顶点着色器那样,单独存在。他们在运行的时候,必须有一个顶点着色器被激活。

为什么大家要使用像素着色器?
1 像素着色器过去是一种高级图形技术,专门用来提高渲染速度。
2 和顶点着色器一样,使用像素着色器,程序员能自定义渲染每个像素。

像素着色器如何运作?
一个像素着色器操作顶点上单独的像素。和顶点着色器一样,像素着色器源代码也是通过一些API加载到硬件的。

如何创建一个像素着色器?
也和顶点着色器一样,你只需要一个文本编辑器和支持着色器编程的显卡即可。同样,API(Direct3D OpenGL)加载像素着色器代码指令到硬件中。


第三部分 寄存器

我们需要什么样的硬件支持?
1 需要DirectX SDK 9.0(DX用户)。注意:我们的顶点着色器的版本是vs2.0。(Dx9支持)
2 需要OpenGL 1。4(OpenGL用户)。
3 可编程着色器显卡。

什么是寄存器?
寄存器是显卡GPU的内存位置,直观的说,可以把寄存器想象成变量存放的地方。现在,有相当数量的寄存器你可以使用!顶点着色器拥有比像素着色器更多的寄存器。

<顶点着色器寄存器>
我们先看看可供使用的顶点着色器有哪些?
1 输入寄存器16个
2 输出寄存器9个(GeForce显卡)或11个(Radeon显卡)(译者注:请参看最新的显卡介绍,硬件更新太快,没办法。)
3 常数寄存器96个(GeForce显卡)或192个(Radeon显卡)
4 临时寄存器12个
5 地址寄存器1个(顶点着色器vc2.0)

这些寄存器都是干什么的?
1 输入寄存器保留顶点的数值,当顶点要建立渲染时。比如(D3D),输入寄存器v0将保存顶点位置,v1保存颜色。(例子代码在下一章)
2 输出寄存器保存将要被渲染的顶点,最终的值。在下面的例子中,输出寄存器oPos保存顶点的输出位置,oD0保存顶点颜色。(这些值可能会被更新)
3 常量寄存器保存你自己写入的数据。例子中,你可以写进光线颜色,那么,就可以设定寄存器c[15]。你可以混合顶点颜色数据:基于当前光照oD0,使v1附上新的颜色。
4 临时寄存器被用来保存临时变量。
5 地址寄存器保存地址偏移量(整数)。

不要对上面介绍的东西害怕。我也是第一次学习这些东西(译者:我也是-_-!)。

<像素着色器寄存器>
然后我们看看像素着色器寄存器都有些什么?
1 常量寄存器8个
2 纹理寄存器4个(ps1.4里有6个)
3 临时寄存器2个(ps1.4里有6个)
4 颜色寄存器2个

这些寄存器都是干什么的?
1 常量寄存器保存用户输入的数据
2 纹理寄存器保存对应顶点的纹理坐标
3 颜色寄存器保存像素的输出颜色
4 临时寄存器保存临时值

后面还有教程看,耐心点。

第四部分 教程(分别使用了D3D和OpenGL)

顶点着色器例子(D3D版):
// Header section…

vs.2.0 // Vertex Shader version

// Define the input information…
dcl_position v0 // Declare that v0 will be the original position
dcl_color v1 // Declare that v1 will hold the original color

// Set the output information…
mov oPos, v0 // Move the original position to the final position
mov oD0, v1 // Move the original color to the final color

每个顶点着色器都是由3部分组成:头,输入定义段,数据段。

顶点着色器例子(OpenGL using vertex shader extension GL_ARB_vertex_program)
// Header section…

!!ARBvp1.0 // Vertex Shader version

// Declare that VPos will be the original position and VCol is the original color
ATTRIB VPos = vertex.position;
ATTRIB VCol = vertex.color;

// Declare that OutPos is the output position and OutColor is the output color
OUTPUT OutPos = result.position;
OUTPUT OutColor = result.color;

// Set the output information…
mov OutPos, VPos // Move the original position to the final position
mov OutColor, VCol // Move the original color to the final color

顶点着色器包括4部分:头,输入定义段,输出定义段,数据段。

像素着色器(Direct3D using pixel shader ps.1.1)
ps.1.1 // version number.

mov r0, v0 // Move the original pixel color to the output color so we can use that.

此着色器使用原始颜色数据输出。

像素着色器(OpenGL using pixel shader extension GL_ARB_fragment_program)
!!ARBfp1.0

ATTRIB inColor = fragment.color.primary; # Original pixel color.

OUTPUT outColor = result.color; # Define output color.

MOV outColor, inColor; # Move original color to the output so we can use that.
END # Define end of the pixel shader.

此着色器使用原始颜色数据输出。

第五部分 结论

使用顶点和像素着色器会极大的改善图形质量。

阅读(2683) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-11-20 21:02:03

我看了一些介绍顶点着色器的书,一直没看明白,今天看了你写的贴有所进步,谢谢发帖。