转载者注:下面这篇文章很多地方翻译的并不是很确切,比如渲染翻译成管线,还有的语句并不通顺,大概是使用了金山快译类似的软件翻译,然后稍作修改而成的,所以希望在读这篇翻译稿的时候自己取舍其中的精华和糟粕。
翻译非常烂 译自 《Direct3D.ShaderX. Vertex and Pixel Shader Tips and Tricks》
烂文翻译版权归 me所有 microsoftxiao
Direct3D ShaderX - Vertex and Pixel Shader Tips and Tricks
Edlted by Wolfgang F.Engel
目录
序
Microsoft DirectX 8.0革命性的可编程图形到来了。可编程几何管线和可编程像素管线,控制几何和像素给开发者。这对于图形开发者是空前的,一旦他们有了基本的着色器,现在有工具,并产生新的,作为未知的效果。Wolfgang和它的贡献者有选择它们相信它的说明将给你开启创建你自己的效果使用可编程图形管线的大门。
第1部分
这个介绍覆盖了顶点着色器和像素着色器的基础理论。你将学习这里必要的每个程序顶点和像素从写windows熟悉操作系统。另外,有篇介绍Shader Studio一个设计顶点和像素着色器的工具。
第一部分: 介绍着色器编程
顶点着色器基础
你需要知道什么设备
在管线上的顶点着色器
为什么使用顶点着色器?
顶点着色器工具
NVIDIA Effects Browser 2/3
NVIDIA Shader Debugger
Shader City
Vertex Shader Assembler
NVIDIA NVASM - Vertex and Pixel Shader Macro Assembler
Microsoft Verex Shader Assemler
Shader Studio
NVLink 2.x
NVIDIA Photoshop Plug-ins
Diffusion Cubemap Tool
DLL Detective with Direct3D Plug-in
3D Studio Max 4.x/gmax 1.1
顶点着色器体系
高级View of顶点着色器编程
检测顶点着色器支持
顶点着色器声明
设置顶点着色器常量寄存器
写和编译一个顶点着色器
应用提示
顶点着色器中的复杂指令
所有整合在一起
欺骗和掩饰
写顶点着色器的方针
编译顶点着色器
创建顶点着色器
设置顶点着色器
释放顶点着色器资源
下一步发生什么?
顶点着色器编程
顶点着色器基础
这篇文章讨论顶点着色器,顶点着色工具,和光照和变换使用顶点着色器。
顶点着色器编程
这篇文章描述怎样写和编译一个顶点着色器。
关于 顶点和像素着色器编程学习(适合读者) 这本书是GPU中的汇编的学习资料
对于想深入,想进一步优化着色器代码,读懂汇编的GPU代码是很好的资料。
而对于想快速创建着色器,使用HLSL GLSL来说,这本书并不适合。
目录
前言
你需要什么设备
管线的顶点着色器
为什么使用顶点着色器?
前言
(或者,为什么他又写了另一本 ?)
另一本书?这里我们反对...
我们已经看到曾经越来越多图形性能在PC上自从3dfx发布Voodoo卡在1995以来。虽然这个性能已经允许PCs运行更快的图形,它可能不允许更快的运行图形。基本限制他们大部分的固定渲染管限在PC图形加速卡沙锅内更快,意味着硅片设计者已经把图形算法集程到图形卡芯片,产生的结果是,游戏和应用开发使用不会使用这些指定固定的算法。
十年前,图形技术以及功能作为RenderMan从Pixar动画工作室有已经成为专业高质量真实渲染的手段。
Pixar的使用的RenderMan他们开发电影作为Toy Stary and A Bug's LIfe已经在真实图形产生了结果让全世界的观众吃惊。RenderMan'可编程的允许它发展主要的新的渲染技术在创造。
利用严格显示在计算,RaenderMan允许程序灵活和创建到了极限。然而这个可编程受到软件实现的限制。
现在,这次,廉价的硬件已经可以开始实现类似RenderMan使用的实时性能了。
重要的3DAPIs(DirectX和OpenGL)已经进化图形硬件。重要的新特性是可编程提供汇编语言结构来变换和光照硬件(顶点着色器)和像素管线(pixelShader).这个可编程管线为开发更自由的在以前的实时应用中是从来没有过的。
着色器编程是新的和实时向游戏程序员挑战。坚持到底...
你需要知道什么/设备
你需要基本的理解数学带边性的游戏引擎,你需要一个基本的理解DirectX 图形API的书籍。它帮助如果你知道怎样使用变换和光照(T&L)管线和SetTextureStageState()调用。如果你需要这写话题的帮助,我推荐从头的先看些介绍性的文字,像《Beginning Direct3D Game Programming》。
DirectX 8.1 SDK
Windows 2000 至少 Service Pack 2或者更高或 Windows XP 专业版(NVIDIA着色器仅可以运行在这些系统上)
Visual C/C++ 6.0至少Service Pack 5(需要DirectX 8.1 SDK)或者更高
至少128的内存
至少500MB的硬盘
硬件加速卡。可以获取最大可视化例子,你需要自己相关的图形硬件。像素着色器例子将仅仅运行在GeForce3/4 TI或者Radeon 8x00类的板卡上。
最新的图形加速卡驱动
如果不幸没有自己的GeForce33/4TI,Radeon 8x00,或者一个类似的图形卡(硬件支持着色器),汇编接口将提供更高的软件顶点着色器在AMD和Intel有优化为它们的CPUs.这些软件实习将跳国当没有顶点着色器有能力发现硬件。不兼容的软件模拟是像素着色器。
管线的顶点着色器
下面的图表展示了源或多边形,顶点和像素操作在Direct3D管线在非常简单的方式。
在原数据级别,顶点被集合和镶嵌。这个高目标的原始数据模块,工作在镶嵌高级原始像N-Patch(作为支持ATI RAdeon 8500在硬件上),五次贝塞尔曲线,B-splines,和矩形和三角形的块。
注意:它看气力是,开始使用21.81驱动,NVIDIA不在支持RT-Patches在GetForce3/4TI.
GPU支持N-Patches产生控制Bezier三角形点每个输入数据三角形。这个控制mesh是基于在位置和原始三角形的饿法线。Bezier表面是镶嵌和粗略值,创建更多三角形在芯片上[Vlachos01].
注意: N-Patch的功能在jDirect3D 8.1被增强。有更多控制覆盖在篡写位置的工作和产生顶点的法线。新的D3DRS_POSITIONORDER和D3DRS_NORMALORDER渲染状态控制这个插补目标。这个位置插补目标可以被也被设置D3DORDER_LINEAR或者D3DORDER_CUBIC.
注意:法线插补目标可以被设置为D3DORDER_LINEAR或者D3DORDER_QUADRATIC.在Direct3D 8.0,位置插补被硬件wire到D3DORDER_CUBIC和规格化插补被hard-wire到D3DORDER_LINEAR.
注意:如果N-Pathches整合使用可编程顶点着色器,你可以贮藏位置和规格化信息在输入寄存器的v0和v3.那是因为N-Patch tessellator需要知道通知的驱动在哪里。
下一个阶段展示图1覆盖帝国难点在Direct3D管线操作。有两种不同的顶点处理方式:
1.固定渲染管线 - 这是标准的几何&光照(T&L)管线,功能是固定的。T&L管线可以被渲染状态控制,矩阵,光照和采制参数。
2.顶点着色器. -这是新的在DirectX8中的机制。取代设置参数来控制管线,你写一个着色器程序在图形硬件上执行。
焦点就在顶点着色器上。它明显的简化了图1的面裁剪,用户裁剪面,视锥裁剪,同质划分,和视口贴图操作在顶点着色器后。因此,这些状态是固定的不能变化,而顶点着色器可以。顶点着色器也不能些顶点,它不可以创建顶点;它产生一输出从每个接收的输入。
那么顶点着色器的好处呢?
为什么使用顶点着色器?
如果你使用顶点着色器,你越过固定渲染管线或T&L管线。但是为什么你想跳过它呢?
传统的T&L管线不支持流行的顶点计算它自己的属性,和处理经常要在几何引擎和CPU共享。有时,导致冗余。
这也缺乏自由。许多在游戏中看起来相似的hard-wired效果。固定渲染管线使开发者不能自由的的独特的和革命的图形效果。程序上的模块使用顶点着色器开启更多一般语法给指定公共操作。灵活的使用顶点着色器,开发者可以完成下面的包括:
几何程序(布模拟,肥皂泡[Isidoro/Gosselin])
角色的高级顶点混合和顶点morphing(tweening)
纹理产生[Riddle/Zecha]
高级关键帧interpolation(complex facial expression and speech)
粒子系统渲染[Le Grand]
实时修改透视视图(lens effects,underwater effects)
高级光照模型(often in cooperation with the pixel shader)[Bendel]
转置贴图步骤[Calver]
有更多的效果可以使用顶点着色器,一些还没有被想出来。例如,一些SIGGRAPH书中最后描述的图形学效果被在SGI硬件上实现。也许很快就向使用顶点和像素着色器向消费者硬件挑战。
另外开发者和艺术家开始创造性,着色器也强迫视频内存贷款被在着色器芯片硬件上执行。那走,例如,Bezier patches.每个顶点的浮点值(plus一个固定的每个原始像素值),一个可以设计顶点着色器到产生位置,法线,一系列的纹理坐标。顶点着色器相等给你解压缩能力,位置,法线,颜色,矩阵和纹理坐标数据和保存一些有价值的带宽没有另外的浪费。
在你未来的学习曲线上有好处。程序员模块使用顶点着色器是可升级的。因此,增加新的指令为开发者。
顶点着色工具
作为你将看到的,你被需要控制指定的RISC-系的汇编语言在程序里顶点着色器因为使用顶点着色器被执行责任为程序的几何处理器。因此,它重要的使用正确的工具开始开发着色器是快速的和可能卓有成效的。
I would like to present the tools that I am aware of at the time of publication.
NVIDIA提供了它自己的DirectX 8 SDK,并装入它的工具,demos和介绍DirectX 8.0.所有demos使用叫做效果浏览器的框架。
这个Effects Browser是一款很棒的测试和开发顶点和像素着色器的工具。你可以选择你喜欢看的效果在左边圆柱。中间给你可能的看到顶点来源或像素着色器。正确的圆柱显示效果。
不是所有的图形卡都支持Effect Browser里的效果。 GeForce3/4TI将支持所有的效果。在你当前图形卡偏爱独立的,我推荐你下载NVIDIA的DirectX 8 SDK和试图。有许多例子,包括解释细节,展示给你使用顶点和像素着色器变化的效果。即将来临的NVIDIA效果浏览器3将提供自动在线更新能力。
顶点着色器体系
让我们更深入的获取图形信息看下顶点着色器的体系:
寄存器(128bits == 4floats 12 entries)->Vertex Input(128bits == 4floats 16entries)
->VertexShader 128 instructions -> VertexOutput(128bits == 4 floats 13entries)- ->
Constant Memory(128bits == 4floats 96entries RADEON 8500: 192entries)
顶点着色起上所有数据都用128bit四维-floats(4x32bit):
x y z w
一贯件顶点着色器已经被典型的SIMD(Single Instruction Multiple Data)处理器,作为你应用一个指令和影响到4个32bit变量的设置。数据格式非常有用因为大部分变换和关照计算使用4x4矩阵或四元组执行。指令非常简单和容易理解。顶点着色器不允许任何循环,跳转,或者条件分支,这意味着它执行起来是线性程序-一个接一个。DirectX 8.x最大的顶点着色器程序指令长度为128指令。整合顶点着色器到有计算转换和另一个计算光照难以忍受的。仅仅一个顶点着色器在一次可以被激活,而且活动的顶点着色器械=必须所有请求每个顶点输出数据。
所有顶点着色器使用16个输入积存器(命名为v0-v15,每个寄存器由128bit(4x32)quad-floats)组成用于存取顶点输入数据。顶点输入寄存器可以容易的从电点顶点获取数据:位置坐标,法线,扩散和反射颜色,雾坐标,和点大小信息为坐标多个纹理。
常量寄存器(常量内存)被在顶点着色器启动执行前通过CPU加载由程序员定义。顶点着色器不可以写常量寄存器。他们被使用存储程序员像光位置,矩阵,程序上的特殊动画效果,顶点插补数据为morphing/关键帧interpolation,更多。常量可以不使用程序,而且甚至被间接的定位地址使用地址寄存器(a0.x,但是每条指令仅仅可以使用一个常量。如果一个指令需要更多的常量,它必须加载一个在被请求之前被加载到临时的寄存器中。常量寄存器从c0-c95,在ATI RADEON 8500,c0-c191.
临时积存器由12个寄存器计算媒体组成。它们可以被用来加载数据和存储数据(读/写).临时寄存器被r0-r11.
顶点输出寄存器有13,依赖于硬件。输出寄存器总用于输出。输出寄存器也可以每个执行光栅,你的顶点着色器程序已经仅仅访问它。最后结果也被另一个顶点执行,顶点变换到同质的裁剪空间。下表是一个所有可用到的寄存器的表。
Input(v0-v15) 16 RO1
Output(o*) GetForce 3/4TI: 9; RADEON 8500: 11 WO
Consants(c0c=-c95) vs.1.1 Specification: 96; RADEON 8500: 192 RO1
Temporary(r0-r11) 12 R1W3
Adress(a0.x) 1(vs.1.1 and higher) WO(W: only with mov)
在输出寄存流自然是顶点着色器标识符只读的和输出寄存器是可写的。
高级视图的顶点着色器程序
每次仅仅可以激活一个顶点着色器。在每个基础任务上更好想法是写顶点着色器。在不同的着色器之间切换是很小消耗的,例如,纹理改变。所以如果对象需要特殊的几何或光照呢,它将获取适当的着色器信息。让我们构造一个抽象的例子:
你可以遭遇外部的行星。在正规马甲外穿女衣服仅仅使用jigsaw,you move through the candlelit cellars.一个怪物允许,你蜷缩在那些柳条箱里一个正常的找到其他行星。同时思考你的命运是英雄保存jigsaws,你启动计算在这个场景里的几个顶点着色器。
有一个或更多妖怪动画,光,也许反射它的环境。其他的顶点着色器将被用在地板,墙壁,箱子,摄影机,烛光和你的jigsaw.也许地板什么用同样的着色器,但是烛光和摄影机用它们自己的。这依赖于你的设计和图形卡硬件的强大。
注意:你也许使用顶点着色器在每个对象或者每个mesh基础。如果,例如,一个*.md3模型组成,我们说10个meshes,你可以执行10个不同的顶点着色器,但是也许损害你的游戏性能。
每个顶点着色器驱动程序必须运行使用下面的步骤:
检测D3DCAPS8::VertexShaderVersion检测顶点着色器的支持情况。
使用D3DVSD_*宏定义影射顶点缓冲流到输入寄存器
使用SetVertexShaderConstant()设置常量寄存器
当顶点着色器使用D3DXAssembleShader*()(这个预编译程序汇编)写在顶点着色器
使用CreateVertexShader()创建顶点着色器句柄
使用SetVertexShader()指定顶点着色器对象
使用DeleteVertexShader()删除顶点着色器。
检测顶点着色器版本支持
检测用户是否安装顶点着色器的软件或硬件实现是重要的。如果缺乏指定特性的支持,然后应用程序可以要求命令。下面的语句检测顶点着色器版本1.1:
if(pCaps->VertexShaderVersion < D3DVS_VERSION(1,1))
return E_FAIL;
下面的语句检测顶点着色器版本1.0:
if(pCaps->VertexShaderVersion < D3DVS_VERSION(1,0))
return E_FAIL;
D3DCPAS8结构必须调用GetDeviceCaps()函数来跳虫。如果你使用公共文件框架提供的DirectX 8.1 SDK,框架将帮你完成。如果你的图形硬件不支持你的顶点着色器版本,你必须使用D3DCREATE_SOFTWARE_VERTEXPROCESSING标志在CreateDevice()调用软件顶点着色器。先前提及的
优化软件实现在Intel和AMD提供它们的各自的CPUs将处理顶点着色器。
支持的顶点着色器版本:
Version
0.0 DirectX 7
1.0 DirectX 8 without addresss register a0
1.1 Direct 8 and DirectX 8.1 with one addresss register a0
2.0 DirectX 9
在1.0和1.1之间仅仅是a0寄存器的支持的不同。DirectX 8.0和DirectX 8.1引用光栅线和软件模拟设备被Intel和AMD它们各自的CPU支持1.1.在时间发布上,仅仅GeForce3/4TI和RADEON 8500驱动板卡在硬件上支持1.1.不知道仅仅支持vs 1.0的图形卡出版没有,所以是遗留下来的版本。 |