﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-前进的路上-随笔分类-HLSL</title><link>http://www.cppblog.com/wc250en007/category/16924.html</link><description>前进的路上</description><language>zh-cn</language><lastBuildDate>Thu, 05 Jan 2012 09:10:03 GMT</lastBuildDate><pubDate>Thu, 05 Jan 2012 09:10:03 GMT</pubDate><ttl>60</ttl><item><title>顶点着色器入门</title><link>http://www.cppblog.com/wc250en007/archive/2012/01/05/163612.html</link><dc:creator>Let me see see</dc:creator><author>Let me see see</author><pubDate>Thu, 05 Jan 2012 02:45:00 GMT</pubDate><guid>http://www.cppblog.com/wc250en007/archive/2012/01/05/163612.html</guid><wfw:comment>http://www.cppblog.com/wc250en007/comments/163612.html</wfw:comment><comments>http://www.cppblog.com/wc250en007/archive/2012/01/05/163612.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wc250en007/comments/commentRss/163612.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wc250en007/services/trackbacks/163612.html</trackback:ping><description><![CDATA[<span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium 'Times New Roman'; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="text-align: left; line-height: 24px; font-family: Arial, 宋体; font-size: 14px" class="Apple-style-span">
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px"><strong>顶点着色器</strong>(vertex shader)是一个在图形卡的GPU上执行的程序，它替换了固定功能管线(fixed function pipeline)中的变换(transformation)和光照(lighting)阶段。(这不是百分之百的正确，因为顶点着色器可以被Direct3D运行时(Direct3D runtime)以软件模拟，如果硬件不支持顶点着色器的话)。图17.1说明了管线中顶点着色器替换的部件。</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" align="center"><a style="font-family: Arial; color: rgb(31,58,135); text-decoration: underline" href="http://dev.yesky.com/imagelist/2008/101/4t8c802qzd6a.jpg" target="_blank"><img style="padding-bottom: 0px; border-right-width: 1px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 1px; border-bottom-width: 1px; border-left-width: 1px; padding-top: 0px" border="0" alt="" src="http://dev.yesky.com/imagelist/2008/101/4t8c802qzd6as.jpg" /></a></p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　从图17.1，我们知道，顶点以局部坐标输入到顶点着色器，并且必须输出齐次剪裁空间的有颜色的顶点。(经投影矩阵变换顶点后的空间称作齐次剪裁空间(homogeneous clip space)。因此，要把一个顶点从局部空间变换到齐次坐标空间，我们必须应用下列变换序列：世界变换(world transformation)，视图变换(<a style="font-family: Arial; color: rgb(31,58,135); text-decoration: underline" href="http://www.mydown.com/soft/multimedia/browsing/182/409182.shtml" target="_blank">view</a><span class="Apple-converted-space">&nbsp;</span>transformation)和投影变换(projection transformation)，它们分别由世界矩阵，视图矩阵和投影矩阵来完成。)对于点元(point primitive)，顶点着色器也被用于操作每个顶点的顶点大小。</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　由于顶点着色器是我们(在HLSL中)写的一个自定义程序，因此我们在图形效果方面获得了极大的自由性。我们不再受限于Direct3D的固定光照算法。此外，应用程序操纵顶点位置的能力也有了多样性，例如：cloth simulation，粒子系统的点大小操纵，还有顶点混合/morphing。此外，我们的顶点数据结构更自由了，并且可以在可编程管线中包含比在固定功能管线中多得多的数据。</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　顶点着色器仍然是相对新的特性，并且许多图形卡不支持它们，特别是随<a style="font-family: Arial; color: rgb(31,58,135); text-decoration: underline" href="http://www.mydown.com/soft/multimedia/manipulate/247/440747.shtml" target="_blank">DirectX 9</a>发布的较新版本的顶点着色器。通过检查D3DCAPS9结构的VertexShaderVersion成员，可以测试顶点着色器的版本。下列代码段展示了这一点：</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　</p>
<table style="border-bottom: rgb(204,204,204) 1px dotted; border-left: rgb(204,204,204) 1px dotted; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; table-layout: fixed; border-top: rgb(204,204,204) 1px dotted; border-right: rgb(204,204,204) 1px dotted; padding-top: 0px" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr style="padding-bottom: 0px; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">
<td style="padding-bottom: 0px; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" bgcolor="#f3f3f3"><font style="color: rgb(153,0,0); font-weight: bold">以下是引用片段：</font><br />　//&nbsp;If&nbsp;the&nbsp;device's&nbsp;supported&nbsp;version&nbsp;is&nbsp;less&nbsp;than&nbsp;version&nbsp;2.0<span class="Apple-converted-space">&nbsp;</span><br />　　if(&nbsp;caps.VertexShaderVersion&nbsp;&lt;&nbsp;D3DVS&nbsp;VERSION(2,&nbsp;0)&nbsp;)<span class="Apple-converted-space">&nbsp;</span><br />　　//&nbsp;Then&nbsp;vertex&nbsp;shader&nbsp;version&nbsp;2.0&nbsp;is&nbsp;not&nbsp;supported&nbsp;on&nbsp;this&nbsp;device.</td></tr></tbody></table>　　我们看到D3D_VERSION的两个参数分别接收主和次版本号。现在，D3DXCompileShaderFromFile函数支持顶点着色器版本1.1和2.0。 
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px"></p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　17.1顶点声明</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　我们已经使用自由顶点格式(flexible vertex format，FVF)来描述顶点结构中的各分量。但是，在可编程管线中，顶点数据包含的数据比用FVF所能表达的多很多。因此，我们通常使用更具表达性并且更强大的顶点声明(vertex declaration)。注意：如果FVF能够描述我们的顶点格式我们仍然可以在可编程管线中使用它。<span style="color: red">不管用何种方法，只是为了方便，同样FVF会在内部被转换为一个顶点声明。</span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　17.1.1 描述顶点声明</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　我们将一个顶点声明描述为一个D3DVERTEXELEMENT9结构的数组。D3DVERTEXELEMENT9<span style="color: red">数组中的每个成员描述了一个顶点的分量</span>。所以，如果你的顶点结构有三个分量(例如：位置、法线、颜色)，那么其相应的顶点声明将描述3个D3DVERTEXELEMENT9结构的数组。这个D3DVERTEXELEMENT9结构定义如下：</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　</p>
<table style="border-bottom: rgb(204,204,204) 1px dotted; border-left: rgb(204,204,204) 1px dotted; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; table-layout: fixed; border-top: rgb(204,204,204) 1px dotted; border-right: rgb(204,204,204) 1px dotted; padding-top: 0px" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr style="padding-bottom: 0px; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">
<td style="padding-bottom: 0px; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" bgcolor="#f3f3f3"><font style="color: rgb(153,0,0); font-weight: bold">以下是引用片段：</font><br />typedef&nbsp;struct&nbsp;_D3DVERTEXELEMENT9&nbsp;{<span class="Apple-converted-space">&nbsp;</span><br />　　BYTE&nbsp;Stream;<span class="Apple-converted-space">&nbsp;</span><br />　　BYTE&nbsp;Offset;<span class="Apple-converted-space">&nbsp;</span><br />　　BYTE&nbsp;Type;<span class="Apple-converted-space">&nbsp;</span><br />　　BYTE&nbsp;Method;<span class="Apple-converted-space">&nbsp;</span><br />　　BYTE&nbsp;Usage;<span class="Apple-converted-space">&nbsp;</span><br />　　BYTE&nbsp;UsageIndex;<span class="Apple-converted-space">&nbsp;</span><br />　　}&nbsp;D3DVERTEXELEMENT9;</td></tr></tbody></table>　　Stream&#8212;&#8212;指定与顶点分量相关联的流 
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px"></p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　ffset&#8212;&#8212;偏移，按字节，相对于顶点结构成员的顶点分量的开始。例如，如果顶点结构是：</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　</p>
<table style="border-bottom: rgb(204,204,204) 1px dotted; border-left: rgb(204,204,204) 1px dotted; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; table-layout: fixed; border-top: rgb(204,204,204) 1px dotted; border-right: rgb(204,204,204) 1px dotted; padding-top: 0px" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr style="padding-bottom: 0px; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">
<td style="padding-bottom: 0px; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" bgcolor="#f3f3f3"><font style="color: rgb(153,0,0); font-weight: bold">以下是引用片段：</font><br />struct&nbsp;Vertex<span class="Apple-converted-space">&nbsp;</span><br />　　{<span class="Apple-converted-space">&nbsp;</span><br />　　D3DXVECTOR3&nbsp;pos;<span class="Apple-converted-space">&nbsp;</span><br />　　D3DXVECTOR3&nbsp;normal;<span class="Apple-converted-space">&nbsp;</span><br />　　};</td></tr></tbody></table>　　&#8230;&#8230;pos分量的偏移是0，因为它是第一个分量;normal分量的偏移是12，因为sizeof(pos) = 12。换句话说，normal分量以Vertex的第12个字节为开始。 
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px"></p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　Type&#8212;&#8212;指定数据类型。它可以是D3DDECLTYPE枚举类型的任意成员;完整列表请参见文档。常用类型如下：</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　D3DDECLTYPE_FLOAT1&#8212;&#8212;浮点数值</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　D3DDECLTYPE_FLOAT2&#8212;&#8212;2D浮点向量</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　D3DDECLTYPE_FLOAT3&#8212;&#8212;3D浮点向量</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　D3DDECLTYPE_FLOAT4&#8212;&#8212;4D浮点向量</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　D3DDECLTYPE_D3DCOLOR&#8212;D3DCOLOR类型，它扩展为RGBA浮点颜色向量(r g b a)，其每一分量都是归一化到区间[0, 1]了的。</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　Method&#8212;&#8212;指定网格化方法。我们认为这个参数是高级的，因此我们使用默认值，标识为D3DDECLMETHOD_DEFAULT.。</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　Usage&#8212;&#8212;指定已计划的对顶点分量的使用。例如，它是否准备用于一个位置向量、法线向量、纹理坐标等?有效的用途标识符(usage identifier)是D3DDECLUSAGE枚举类型的：</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　</p>
<table style="border-bottom: rgb(204,204,204) 1px dotted; border-left: rgb(204,204,204) 1px dotted; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; table-layout: fixed; border-top: rgb(204,204,204) 1px dotted; border-right: rgb(204,204,204) 1px dotted; padding-top: 0px" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr style="padding-bottom: 0px; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">
<td style="padding-bottom: 0px; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" bgcolor="#f3f3f3"><font style="color: rgb(153,0,0); font-weight: bold">以下是引用片段：</font><br />typedef&nbsp;enum&nbsp;_D3DDECLUSAGE&nbsp;{<span class="Apple-converted-space">&nbsp;</span><br />　　D3DDECLUSAGE_POSITION&nbsp;=&nbsp;0,&nbsp;//&nbsp;Position.<span class="Apple-converted-space">&nbsp;</span><br />　　D3DDECLUSAGE_BLENDWEIGHTS&nbsp;=&nbsp;1,&nbsp;//&nbsp;Blending&nbsp;weights.<span class="Apple-converted-space">&nbsp;</span><br />　　D3DDECLUSAGE_BLENDINDICES&nbsp;=&nbsp;2,&nbsp;//&nbsp;Blending&nbsp;indices.<span class="Apple-converted-space">&nbsp;</span><br />　　D3DDECLUSAGE_NORMAL&nbsp;=&nbsp;3,&nbsp;//&nbsp;Normal&nbsp;vector.<span class="Apple-converted-space">&nbsp;</span><br />　　D3DDECLUSAGE_PSIZE&nbsp;=&nbsp;4,&nbsp;//&nbsp;Vertex&nbsp;point&nbsp;size.<span class="Apple-converted-space">&nbsp;</span><br />　　D3DDECLUSAGE_TEXCOORD&nbsp;=&nbsp;5,&nbsp;//&nbsp;Texture&nbsp;coordinates.<span class="Apple-converted-space">&nbsp;</span><br />　　D3DDECLUSAGE_TANGENT&nbsp;=&nbsp;6,&nbsp;//&nbsp;Tangent&nbsp;vector.<span class="Apple-converted-space">&nbsp;</span><br />　　D3DDECLUSAGE_BINORMAL&nbsp;=&nbsp;7,&nbsp;//&nbsp;Binormal&nbsp;vector.<span class="Apple-converted-space">&nbsp;</span><br />　　D3DDECLUSAGE_TESSFACTOR&nbsp;=&nbsp;8,&nbsp;//&nbsp;Tessellation&nbsp;factor.<span class="Apple-converted-space">&nbsp;</span><br />　　D3DDECLUSAGE_POSITIONT&nbsp;=&nbsp;9,&nbsp;//&nbsp;Transformed&nbsp;position.<span class="Apple-converted-space">&nbsp;</span><br />　　D3DDECLUSAGE_COLOR&nbsp;=&nbsp;10,&nbsp;//&nbsp;Color.<span class="Apple-converted-space">&nbsp;</span><br />　　D3DDECLUSAGE_FOG&nbsp;=&nbsp;11,&nbsp;//&nbsp;Fog&nbsp;blend&nbsp;value.<span class="Apple-converted-space">&nbsp;</span><br />　　D3DDECLUSAGE_DEPTH&nbsp;=&nbsp;12,&nbsp;//&nbsp;Depth&nbsp;value.<span class="Apple-converted-space">&nbsp;</span><br />　　D3DDECLUSAGE_SAMPLE&nbsp;=&nbsp;13&nbsp;//&nbsp;Sampler&nbsp;data.<span class="Apple-converted-space">&nbsp;</span><br />　　}&nbsp;D3DDECLUSAGE;</td></tr></tbody></table>　　D3DDECLUSAGE_PSIZE类型用于指定一个顶点的大小。它用于点精灵，因此我们可以基于每个顶点控制其大小。一个D3DDECLUSAGE_POSITION成员的顶点声明意味着这个顶点已经被变换，它通知图形卡不要把这个顶点送到顶点处理阶段(变形和光照)。 
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px"></p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　UsageIndex&#8212;&#8212;用于标识多个相同用途的顶点分量。这个用途索引是位于区间[0, 15]间的一个整数。例如，假设我们有三个用途为D3DDECLUSAGE_NORMAL的顶点分量。我们可以为第一个指定用途索引为0，为第二个指定用途索引为1，并且为第三个指定用途索引为2。按这种方式，我们可以通过其用途索引标识每个特定的法线。</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　顶点描述声明的例子：假设我们想要描述的顶点格式由位置向量和三个法线向量组成。顶点声明可以指定如下：</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　</p>
<table style="border-bottom: rgb(204,204,204) 1px dotted; border-left: rgb(204,204,204) 1px dotted; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; table-layout: fixed; border-top: rgb(204,204,204) 1px dotted; border-right: rgb(204,204,204) 1px dotted; padding-top: 0px" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr style="padding-bottom: 0px; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">
<td style="padding-bottom: 0px; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" bgcolor="#f3f3f3"><font style="color: rgb(153,0,0); font-weight: bold">以下是引用片段：</font><br />　D3DVERTEXELEMENT9&nbsp;decl[]&nbsp;=<span class="Apple-converted-space">&nbsp;</span><br />　　{<span class="Apple-converted-space">&nbsp;</span><br />　　{0,&nbsp;0,&nbsp;D3DDECLTYPE_FLOAT3,&nbsp;D3DDECLMETHOD_DEFAULT,&nbsp;D3DDECLUSAGE_POSITION,&nbsp;0},<span class="Apple-converted-space">&nbsp;</span><br />　　{0,&nbsp;12,&nbsp;D3DDECLTYPE_FLOAT3,&nbsp;D3DDECLMETHOD_DEFAULT,&nbsp;D3DDECLUSAGE_NORMAL,&nbsp;0},<span class="Apple-converted-space">&nbsp;</span><br />　　{0,&nbsp;24,&nbsp;D3DDECLTYPE_FLOAT3,&nbsp;D3DDECLMETHOD_DEFAULT,&nbsp;D3DDECLUSAGE_NORMAL,&nbsp;1},<span class="Apple-converted-space">&nbsp;</span><br />　　{0,&nbsp;36,&nbsp;D3DDECLTYPE_FLOAT3,&nbsp;D3DDECLMETHOD_DEFAULT,&nbsp;D3DDECLUSAGE_NORMAL,&nbsp;2},<span class="Apple-converted-space">&nbsp;</span><br />　　D3DDECL_END()<span class="Apple-converted-space">&nbsp;</span><br />　　};</td></tr></tbody></table>　　D3DDECL_END宏用于初始化D3DVERTEXELEMENT9数组的最后一个顶点元素。同样的，注意法向量的用途索引标签。 
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px"></p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　17.1.2 创建顶点声明</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　一旦你描述了一个顶点声明为D3DVERTEXELEMENT9数组，我们就可以使用下面的方法获得一个IDirect3DVertexDeclaration9接口指针：</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　</p>
<table style="border-bottom: rgb(204,204,204) 1px dotted; border-left: rgb(204,204,204) 1px dotted; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; table-layout: fixed; border-top: rgb(204,204,204) 1px dotted; border-right: rgb(204,204,204) 1px dotted; padding-top: 0px" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr style="padding-bottom: 0px; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">
<td style="padding-bottom: 0px; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" bgcolor="#f3f3f3"><font style="color: rgb(153,0,0); font-weight: bold">以下是引用片段：</font><br />HRESULT&nbsp;IDirect3DDevice9::CreateVertexDeclaration(<span class="Apple-converted-space">&nbsp;</span><br />　　CONST&nbsp;D3DVERTEXELEMENT9*&nbsp;pVertexElements,<span class="Apple-converted-space">&nbsp;</span><br />　　IDirect3DVertexDeclaration9**&nbsp;ppDecl<span class="Apple-converted-space">&nbsp;</span><br />　　);</td></tr></tbody></table>　　pVertexElements&#8212;&#8212;D3DVERTEXELEMENT9结构数组，它描述我们想要创建的顶点声明。 
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px"></p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　ppDecl&#8212;&#8212;用于返回创建的IDirect3DVertexDeclaration9接口指针</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　例子调用，其中decl是一个D3DVERTEXELEMENT9数组：</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　IDirect3DVertexDeclaration9* _decl = 0;</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　hr = _device-&gt;CreateVertexDeclaration(decl, &amp;_decl);</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　17.1.3 使用一个顶点声明</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　回忆一下：自由顶点格式是一个方便的特性并且在内部转换成了顶点声明。因此，当直接使用顶点声明，我们不再需要调用：Device-&gt;SetFVF( fvf );</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　相反，我们调用：Device-&gt;SetVertexDeclaration( _decl );</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　其中，_decl是一个IDirect3DVertexDeclaration9接口指针。</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　17.2顶点数据用途</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　考虑这个顶点声明：</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　</p>
<table style="border-bottom: rgb(204,204,204) 1px dotted; border-left: rgb(204,204,204) 1px dotted; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; table-layout: fixed; border-top: rgb(204,204,204) 1px dotted; border-right: rgb(204,204,204) 1px dotted; padding-top: 0px" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr style="padding-bottom: 0px; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">
<td style="padding-bottom: 0px; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" bgcolor="#f3f3f3"><font style="color: rgb(153,0,0); font-weight: bold">以下是引用片段：</font><br />D3DVERTEXELEMENT9&nbsp;decl[]&nbsp;=<span class="Apple-converted-space">&nbsp;</span><br />　　{<span class="Apple-converted-space">&nbsp;</span><br />　　{0,&nbsp;0,&nbsp;D3DDECLTYPE_FLOAT3,&nbsp;D3DDECLMETHOD_DEFAULT,&nbsp;D3DDECLUSAGE_POSITION,&nbsp;0},<span class="Apple-converted-space">&nbsp;</span><br />　　{0,&nbsp;12,&nbsp;D3DDECLTYPE_FLOAT3,&nbsp;D3DDECLMETHOD_DEFAULT,&nbsp;D3DDECLUSAGE_NORMAL,&nbsp;0},<span class="Apple-converted-space">&nbsp;</span><br />　　{0,&nbsp;24,&nbsp;D3DDECLTYPE_FLOAT3,&nbsp;D3DDECLMETHOD_DEFAULT,&nbsp;D3DDECLUSAGE_NORMAL,&nbsp;1},<span class="Apple-converted-space">&nbsp;</span><br />　　{0,&nbsp;36,&nbsp;D3DDECLTYPE_FLOAT3,&nbsp;D3DDECLMETHOD_DEFAULT,&nbsp;D3DDECLUSAGE_NORMAL,&nbsp;2},<span class="Apple-converted-space">&nbsp;</span><br />　　D3DDECL_END()<span class="Apple-converted-space">&nbsp;</span><br />　　};</td></tr></tbody></table><br />我们需要一种方式，来定义一个顶点声明的元素到顶点着色器的Input结构的数据成员的映射。我们在Input结构中通过指定每个数据成员的语义(: usage-type [usage-index])定义这个映射。语义通过元素的用途类型和用途索引标识顶点声明中的一个元素。由数据成员的语义标识的顶点元素是得以映射到数据成员的元素。例如，对应于前面的顶点声明的输入结构是：<br />&nbsp; 
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px"></p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　</p>
<table style="border-bottom: rgb(204,204,204) 1px dotted; border-left: rgb(204,204,204) 1px dotted; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; table-layout: fixed; border-top: rgb(204,204,204) 1px dotted; border-right: rgb(204,204,204) 1px dotted; padding-top: 0px" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr style="padding-bottom: 0px; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">
<td style="padding-bottom: 0px; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" bgcolor="#f3f3f3"><font style="color: rgb(153,0,0); font-weight: bold">以下是引用片段：</font><br />　struct&nbsp;VS_INPUT<span class="Apple-converted-space">&nbsp;</span><br />　　{<span class="Apple-converted-space">&nbsp;</span><br />　　vector&nbsp;position&nbsp;:&nbsp;POSITION;<span class="Apple-converted-space">&nbsp;</span><br />　　vector&nbsp;normal&nbsp;:&nbsp;NORMAL0;<span class="Apple-converted-space">&nbsp;</span><br />　　vector&nbsp;faceNormal1&nbsp;:&nbsp;NORMAL1;<span class="Apple-converted-space">&nbsp;</span><br />　　vector&nbsp;faceNormal2&nbsp;:&nbsp;NORMAL2;<span class="Apple-converted-space">&nbsp;</span><br />　　};</td></tr></tbody></table>　　注意：如果我们遗漏了用途索引，就意味着用途索引为零。例如，POSITION和POSITION0是同一样东西。 
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px"></p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　<span style="color: red">　这里decl中的元素0，由用途POSITION和用途索引0标识，它映射到position。decl中的元素1，由用途NORMAL和用途索引0标识，它映射到normal。decl中的元素2，由NORMAL和用途索引1标识，它映射到faceNormal1。decl中的元素3，由用途NORMAL和用途索引2标识，它映射到faceNormal2。</span></p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　受支持的顶点着色器输入用途(input usage)是：</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　POSITION [n]&#8212;&#8212;位置</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　BLENDWEIGHTS [n]&#8212;&#8212;混合权重</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　BLENDINDICES [n]&#8212;&#8212;混合索引</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　NORMAL [n]&#8212;&#8212;法线向量</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　PSIZE[n]&#8212;&#8212;顶点大小</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　DIFFUSE [n]&#8212;&#8212;散射颜色</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　SPECULAR [n]&#8212;&#8212;镜面颜色</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　TEXCOORD [n]&#8212;&#8212;纹理坐标</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　其中，n是一个位于区间[0, 15]的可选整数。</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　此外，对于输出结构，我们必须指定每个成员是用来做什么的。例如，数据成员应该被作为位置向量、颜色、纹理坐标等对待吗?图形卡没主意，除非你强制的告诉它。这也需要通过语法的语义来完成：</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　</p>
<table style="border-bottom: rgb(204,204,204) 1px dotted; border-left: rgb(204,204,204) 1px dotted; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; table-layout: fixed; border-top: rgb(204,204,204) 1px dotted; border-right: rgb(204,204,204) 1px dotted; padding-top: 0px" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr style="padding-bottom: 0px; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">
<td style="padding-bottom: 0px; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" bgcolor="#f3f3f3"><font style="color: rgb(153,0,0); font-weight: bold">以下是引用片段：</font><br />　struct&nbsp;VS_OUTPUT<span class="Apple-converted-space">&nbsp;</span><br />　　{<span class="Apple-converted-space">&nbsp;</span><br />　　vector&nbsp;position&nbsp;:&nbsp;POSITION;<span class="Apple-converted-space">&nbsp;</span><br />　　vector&nbsp;diffuse&nbsp;:&nbsp;COLOR0;<span class="Apple-converted-space">&nbsp;</span><br />　　vector&nbsp;specular&nbsp;:&nbsp;COLOR1;<span class="Apple-converted-space">&nbsp;</span><br />　　};</td></tr></tbody></table>　　受支持的顶点着色器输出用途是： 
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px"></p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　POSITION&#8212;位置</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　PSIZE&#8212;顶点大小</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　FOG&#8212;雾混合值</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　COLOR [n]&#8212;顶点颜色。注意：可以有多个顶点颜色被输出，并且这些颜色可以被混合在一起以产生最终的颜色。</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　TEXCOORD [n]&#8212;顶点纹理坐标。注意：多个顶点纹理坐标可以被输出。</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">　　其中，n是一个位于区间[0, 15]的可选整数。</p>
<p style="padding-bottom: 0px; border-right-width: 0px; margin: 0px 0px 12px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px">原文连接：<a href="http://www.cppblog.com/lovedday/category/6620.html">http://www.cppblog.com/lovedday/category/6620.html</a></p></span></span><img src ="http://www.cppblog.com/wc250en007/aggbug/163612.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wc250en007/" target="_blank">Let me see see</a> 2012-01-05 10:45 <a href="http://www.cppblog.com/wc250en007/archive/2012/01/05/163612.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高级着色语言HLSL入门(转)</title><link>http://www.cppblog.com/wc250en007/archive/2011/05/21/146846.html</link><dc:creator>Let me see see</dc:creator><author>Let me see see</author><pubDate>Sat, 21 May 2011 00:08:00 GMT</pubDate><guid>http://www.cppblog.com/wc250en007/archive/2011/05/21/146846.html</guid><wfw:comment>http://www.cppblog.com/wc250en007/comments/146846.html</wfw:comment><comments>http://www.cppblog.com/wc250en007/archive/2011/05/21/146846.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wc250en007/comments/commentRss/146846.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wc250en007/services/trackbacks/146846.html</trackback:ping><description><![CDATA[<blockquote dir="ltr" style="margin-right: 0px">
<p>&nbsp;</p>
<div class="entrylistItem"><a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl00_TitleUrl" href="http://www.cppblog.com/lovedday/archive/2008/04/05/46320.html"><strong>高级着色语言HLSL入门（7）</strong></a> &nbsp;&nbsp;&nbsp;&nbsp; 摘要: 大多数函数已经重载以使其可以对所有内建类型有意义。例如，abs对所有数值类型有意义，所以它为所有这些数值类型进行了重载。又例如，叉积的叉乘仅对 3D向量有意义，所以它对所有类型的3D向量（比如：int，float，double的3D向量）进行了重载。另一方面，线性插值&#8212;&#8212;lerp，对于数值、2D、3D和4D向量有意义，因此重载了这些类型。&nbsp;</div>
<div class="postSeparator">&nbsp;</div>
<div class="entrylistItem"><a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl02_TitleUrl" href="http://www.cppblog.com/lovedday/archive/2008/04/05/46318.html"><strong>高级着色语言HLSL入门（6）</strong></a> &nbsp;&nbsp;&nbsp;&nbsp; 摘要: HLSL有一个丰富的内建函数的集合，它们对3D图形来说非常有用。下表是一个删减了的列表，注意：要得到更多的参考，可以参看DirectX文档中内建HLSL函数的完整列表。&nbsp;</div>
<div class="postSeparator">&nbsp;</div>
<div class="entrylistItem"><a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl04_TitleUrl" href="http://www.cppblog.com/lovedday/archive/2008/04/05/46316.html"><strong>高级着色语言HLSL入门（5）</strong></a> &nbsp;&nbsp;&nbsp;&nbsp; 摘要: 为便于参考，这里给出一个HLSL定义的关键字列表：</div>
<div class="postSeparator">&nbsp;</div>
<div class="entrylistItem"><a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl06_TitleUrl" href="http://www.cppblog.com/lovedday/archive/2008/04/05/46315.html"><strong>高级着色语言HLSL入门（4）</strong></a> &nbsp;&nbsp;&nbsp;&nbsp; 摘要: HLSL支持下列数值类型（scalar type）： <br /><br />bool&#8212;True or false value. Note that HLSL provides the true and false keywords. <br /><br />int&#8212;32bit signed integer <br /><br />half&#8212;16bit floating-point number <br /><br />float&#8212;32bit floating-point number <br /><br />double&#8212;64bit floating-point number <br /><br />注意：一些平台不支持int, half, and double类型，这时我们使用 float类型模拟。&nbsp;&nbsp;</div>
<div class="postSeparator">&nbsp;</div>
<div class="entrylistItem"><a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl08_TitleUrl" href="http://www.cppblog.com/lovedday/archive/2008/04/05/46314.html"><strong>高级着色语言HLSL入门（3）</strong></a> &nbsp;&nbsp;&nbsp;&nbsp; 摘要: 下一个方法就是设置常量的默认值，这些默认值在声明时初始化。这个方法应该在应用程序建立（setup）期间被调用一次 （called once）。&nbsp;</div>
<div class="postSeparator">&nbsp;</div>
<div class="entrylistItem"><a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl10_TitleUrl" href="http://www.cppblog.com/lovedday/archive/2008/04/05/46311.html"><strong>高级着色语言HLSL入门（2）</strong></a> &nbsp;&nbsp;&nbsp;&nbsp; 摘要: 每个着色器有一个常量表，用来保存它的变量。D3DX库通过ID3DXConstantTable接口，提供给应用程序访问着色器的常量表。通过这个接口我们能够在应用程序中设置着色器源代码中的变量。 <br /><br />我们现在描述ID3DXConstantTable接口的方法列表的实现，全部的列表请查阅Direct3D文档。&nbsp;&nbsp;</div>
<div class="postSeparator">&nbsp;</div>
<div class="entrylistItem"><a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl12_TitleUrl" href="http://www.cppblog.com/lovedday/archive/2008/04/05/46310.html"><strong>高级着色语言HLSL入门（1）</strong></a> &nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在我们写的程序里顶点和像素是很小的对象，它们由GPU来执行，是固定功能管线的一部分。用我们自己写的着色器程序替换一部分固定功能管线，在绘制效果上我们获得很大的灵活性。我们不再局限于预定义的"固定"操作。 <br /><br />为了编写着色器程序，我们需要一种高级着色器语言（High-Level Shading Language ，简称HLSL） 。在DirectX 8中，着色器是用低级着色器汇编语言编写的。幸运的是，我们不必再用汇编语言来写着色器了，DirectX 9支持一种高级着色器语言来写。</div>
<p>&nbsp;</p></blockquote><img src ="http://www.cppblog.com/wc250en007/aggbug/146846.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wc250en007/" target="_blank">Let me see see</a> 2011-05-21 08:08 <a href="http://www.cppblog.com/wc250en007/archive/2011/05/21/146846.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Direct3D9 Fx/HLSL的若干条有用的笔记（转）</title><link>http://www.cppblog.com/wc250en007/archive/2011/05/21/146845.html</link><dc:creator>Let me see see</dc:creator><author>Let me see see</author><pubDate>Sat, 21 May 2011 00:02:00 GMT</pubDate><guid>http://www.cppblog.com/wc250en007/archive/2011/05/21/146845.html</guid><wfw:comment>http://www.cppblog.com/wc250en007/comments/146845.html</wfw:comment><comments>http://www.cppblog.com/wc250en007/archive/2011/05/21/146845.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wc250en007/comments/commentRss/146845.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wc250en007/services/trackbacks/146845.html</trackback:ping><description><![CDATA[<div class="postTitle">&nbsp;</div>
<div class="postText">
<p>Direct3D中的Shader是这样的：</p>
<p>1. ASM Shader是最元老的也是DX8主要使用Shader</p>
<p>2. fxc编译器可以同时编译ASM,<strong style="color: black; background-color: #99ff99">HLSL</strong>和fx脚本,其中<strong style="color: black; background-color: #99ff99">HLSL</strong>和fx可以查看编译后的GPU汇编代码</p>
<p>3. D3D9中，fx是<strong style="color: black; background-color: #99ff99">HLSL</strong>的一种渲染脚本，简化了<strong style="color: black; background-color: #99ff99">HLSL</strong>设置及常量绑定，并且附带RenderStateBlock及设置</p>
<p>但只能用于制作简单的Shader</p>
<p>4. DirectXSDK中有一个概念混淆：C++例子中的BasicHLSL使用的其实还是fx，HLSLwithoutEffects例子才是真正的纯<strong style="color: black; background-color: #99ff99">HLSL</strong></p>
<p>5<a name="baidusnap3"></a><strong style="color: black; background-color: #ff9999">.fx</strong>与<strong style="color: black; background-color: #99ff99">HLSL</strong>程序鉴别：</p>
<p>使用fx程序必定含有：D3DXCreateEffectXXX 系列函数， ID3DXEffect对象，渲染中能看到SetTechnique，BeginPass，EndPass之类的字眼</p>
<p>使用纯<strong style="color: black; background-color: #99ff99">HLSL</strong>程序含有：D3DXCompileShader，ID3DXConstantTable对象，GetConstantByName，GetConstantDesc之类的字眼</p>
<p>6. 在fx中包含有 VertexShader，PixelShader代码及profile，entry，RenderState设置及简单的绘制过程(pass)。一次编译后，VS,PS,Texture,Sampler及常量都是在ID3DXEffect对象中自动完成，无需手动设置。</p>
<p>7. <strong style="color: black; background-color: #99ff99">HLSL</strong>可以将VS及PS代码写入1个.<strong style="color: black; background-color: #99ff99">hlsl</strong>文件。注意，以下这种代码可以在<strong style="color: black; background-color: #99ff99">HLSL</strong>中编译过，但实际没有任何效果</p>
<div class="csharpcode"><pre class="alt"><span class="lnum">   1:  </span>sampler_state</pre><pre><span class="lnum">   2:  </span>{</pre><pre class="alt"><span class="lnum">   3:  </span>    Texture = &lt;tex&gt;;</pre><pre><span class="lnum">   4:  </span>    MipFilter = LINEAR;</pre><pre class="alt"><span class="lnum">   5:  </span>    MinFilter = LINEAR;</pre><pre><span class="lnum">   6:  </span>    MagFilter = LINEAR;</pre><pre class="alt"><span class="lnum">   7:  </span>};</pre></div>
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }


<p>这点可以参考AMD RenderMonkey中只在shader中使用sampler而忽略texture。</p>
<p>8. fx中往shader设置纹理使用的是ID3DXBaseEffect::SetTexture下的这个函数</p>
<div class="csharpcode"><pre class="alt"><span class="lnum">   1:  </span>HRESULT SetTexture(</pre><pre><span class="lnum">   2:  </span>  D3DXHANDLE hParameter,</pre><pre class="alt"><span class="lnum">   3:  </span>  LPDIRECT3DBASETEXTURE9 pTexture</pre><pre><span class="lnum">   4:  </span>);</pre></div>
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }


<p>但是在<strong style="color: black; background-color: #99ff99">HLSL</strong>中，这点就变得很麻烦，需要手动设置，可以参考这篇<a href="http://www.cppblog.com/liangairan/articles/57971.html"><u>文章</u></a></p>
<p>Shader代码片段：</p>
<div class="csharpcode"><pre class="alt"><span class="lnum">   1:  </span>sampler Samp0 = sampler_state</pre><pre><span class="lnum">   2:  </span>{</pre><pre class="alt"><span class="lnum">   3:  </span>    Texture = &lt;Tex0&gt;;</pre><pre><span class="lnum">   4:  </span>    MipFilter = LINEAR;</pre><pre class="alt"><span class="lnum">   5:  </span>    MinFilter = LINEAR;</pre><pre><span class="lnum">   6:  </span>    MagFilter = LINEAR;</pre><pre class="alt"><span class="lnum">   7:  </span>};</pre></div>
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }


<p>编译<strong style="color: black; background-color: #99ff99">HLSL</strong>代码后得到ConstantTable，然后取出句柄：</p>
<div class="csharpcode"><pre class="alt"><span class="lnum">   1:  </span>ScalarHandle = pixelConstTable-&gt;GetConstantByName(0, <span class="str">"Scalar"</span>);</pre><pre><span class="lnum">   2:  </span>&nbsp;</pre><pre class="alt"><span class="lnum">   3:  </span>Samp0Handle = pixelConstTable-&gt;GetConstantByName(0, <span class="str">"Samp0"</span>);</pre><pre><span class="lnum">   4:  </span>&nbsp;</pre><pre class="alt"><span class="lnum">   5:  </span>Samp1Handle = pixelConstTable-&gt;GetConstantByName(0, <span class="str">"Samp1"</span>);</pre></div>
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }


<p>再从句柄取出symbol的描述：</p>
<div class="csharpcode"><pre class="alt"><span class="lnum">   1:  </span>UINT count;</pre><pre><span class="lnum">   2:  </span>&nbsp;</pre><pre class="alt"><span class="lnum">   3:  </span>pixelConstTable-&gt;GetConstantDesc(Samp0Handle, &amp; Samp0Desc, &amp;count);</pre><pre><span class="lnum">   4:  </span>&nbsp;</pre><pre class="alt"><span class="lnum">   5:  </span>pixelConstTable-&gt;GetConstantDesc(Samp1Handle, &amp; Samp1Desc, &amp;count);</pre></div>
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }


<p>通过上面的描述，将纹理变量的寄存器偏移作为纹理的stage</p>
<p>8.&nbsp; 优化常量设置速度的方法一般就是根据字符串取出句柄，以后每次渲染时，只通过句柄设置。但ID3DXConstantTable最后还是通过</p>
<p>IDirect3DDevice9::SetPixelShaderConstantX 系列函数来实现的</p>
<div class="csharpcode"><pre class="alt"><span class="lnum">   1:  </span>HRESULT SetPixelShaderConstantF(</pre><pre><span class="lnum">   2:  </span>  UINT StartRegister,</pre><pre class="alt"><span class="lnum">   3:  </span>  CONST <span class="kwrd">float</span> * pConstantData,</pre><pre><span class="lnum">   4:  </span>  UINT Vector4fCount</pre><pre class="alt"><span class="lnum">   5:  </span>);</pre></div>
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }


<p>9. <strong style="color: black; background-color: #99ff99">HLSL</strong>将一段包含VS和PS代码编译完成后，将得到VS和PS两个单独的ID3DXConstantTable</p></div><img src ="http://www.cppblog.com/wc250en007/aggbug/146845.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wc250en007/" target="_blank">Let me see see</a> 2011-05-21 08:02 <a href="http://www.cppblog.com/wc250en007/archive/2011/05/21/146845.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>