📄 顶点着色器 (vertex shaders).htm
字号:
style="FONT-FAMILY: 黑体; mso-fareast-language: ZH-CN; mso-ascii-font-family: Arial">步:渲染输出像素</SPAN><SPAN
lang=EN-US style="mso-fareast-language: ZH-CN"><o:p></o:p></SPAN></H2>
<P>这里是一份代码示例,可以用在渲染循环中用顶点着色器来渲染物体。由于三维场景的变化,渲染循环不断更新顶点着色器常数,并调用<U><SPAN
lang=EN-US>IDirect3DDevice9::DrawPrimitive</SPAN></U>绘制输出顶点。<SPAN
lang=EN-US><o:p></o:p></SPAN></P><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt">// 用视/投影矩阵更新顶点着色器常数。<o:p></o:p></SPAN></PRE><PRE style="tab-stops: 45.8pt 91.6pt 137.4pt 229.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt">D3DXMATRIX mat, <SPAN class=SpellE>matView</SPAN>, <SPAN class=SpellE>matProj</SPAN>;<SPAN style="mso-tab-count: 1"> </SPAN><o:p></o:p></SPAN></PRE><PRE><SPAN class=GramE><SPAN lang=EN-US style="FONT-SIZE: 10pt">D3DXMatrixMultiply(</SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"> &mat, &<SPAN class=SpellE>matView</SPAN>, &<SPAN class=SpellE>matProj</SPAN> );<o:p></o:p></SPAN></PRE><PRE><SPAN class=GramE><SPAN lang=EN-US style="FONT-SIZE: 10pt">D3DXMatrixTranspose(</SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"> &mat, &mat );<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt">m_pd3dDevice-><SPAN class=SpellE><SPAN class=GramE>SetVertexShaderConstantF</SPAN></SPAN><SPAN class=GramE>(</SPAN> 0, (float*)&mat, 4 );<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p> </o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt">// 声明并定义固定的顶点颜色。<o:p></o:p></SPAN></PRE><PRE><SPAN class=GramE><SPAN lang=EN-US style="FONT-SIZE: 10pt">float</SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"> color[4] = {0,1.0,0,0};<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt">m_pd3dDevice-><SPAN class=SpellE><SPAN class=GramE>SetVertexShaderConstantF</SPAN></SPAN><SPAN class=GramE>(</SPAN> 4, (float*)&color, 1 );<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p> </o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt">// 关闭镜面反射光,因为顶点着色器没有输出镜面反射光。<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt">m_pd3dDevice-><SPAN class=SpellE><SPAN class=GramE>SetRenderState</SPAN></SPAN><SPAN class=GramE>(</SPAN> D3DRS_SPECULAR, FALSE ); <o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p> </o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt">// 渲染输出。<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt">m_pd3dDevice-><SPAN class=SpellE><SPAN class=GramE>SetStreamSource</SPAN></SPAN><SPAN class=GramE>(</SPAN> 0, <SPAN class=SpellE>m_pQuadVB</SPAN>, <SPAN class=SpellE>sizeof</SPAN>(CUSTOMVERTEX) );<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt">m_pd3dDevice-><SPAN class=SpellE><SPAN class=GramE>SetVertexShader</SPAN></SPAN><SPAN class=GramE>(</SPAN> <SPAN class=SpellE>m_pVertexShader</SPAN> );<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt">m_pd3dDevice-><SPAN class=SpellE><SPAN class=GramE>DrawPrimitive</SPAN></SPAN><SPAN class=GramE>(</SPAN> D3DPT_TRIANGLEFAN, 0, 2 );<o:p></o:p></SPAN></PRE>
<P>视和投影矩阵包含了摄像机的位置和方向的数据。因为场景可能在渲染得到的帧之间变化,所以渲染循环中要得到最新的数据,并用这些数据更新着色器的常量寄存器</P>
<P><B><SPAN lang=EN-US>IDirect3DDevice9::DrawPrimitive</SPAN></B><SPAN
style="mso-bidi-font-weight: bold">照常使用<U><SPAN
lang=EN-US>IDirect3DDevice9::SetStreamSource</SPAN></U>提供的数据渲染输出数据。<U><SPAN
lang=EN-US>IDirect3DDevice9::SetVertexShader</SPAN></U>是用来告诉<SPAN
lang=EN-US>Direct3D要使用顶点着色器。顶点着色器的结果如下图,它显示了在平面物体上的固定颜色。</SPAN></SPAN><SPAN
lang=EN-US><o:p></o:p></SPAN></P>
<P><SPAN lang=EN-US><!--[if gte vml 1]><v:shapetype id=_x0000_t75 coordsize =
"21600,21600" o:preferrelative = "t" o:spt = "75" filled = "f" stroked = "f"
path = " m@4@5 l@4@11@9@11@9@5 xe"><v:stroke joinstyle =
"miter"></v:stroke><v:formulas><v:f eqn =
"if lineDrawn pixelLineWidth 0 "></v:f><v:f eqn = "sum @0 1 0 "></v:f><v:f eqn =
"sum 0 0 @1 "></v:f><v:f eqn = "prod @2 1 2 "></v:f><v:f eqn =
"prod @3 21600 pixelWidth "></v:f><v:f eqn =
"prod @3 21600 pixelHeight "></v:f><v:f eqn = "sum @0 0 1 "></v:f><v:f eqn =
"prod @6 1 2 "></v:f><v:f eqn = "prod @7 21600 pixelWidth "></v:f><v:f eqn =
"sum @8 21600 0 "></v:f><v:f eqn = "prod @7 21600 pixelHeight "></v:f><v:f eqn =
"sum @10 21600 0 "></v:f></v:formulas><v:path o:extrusionok = "f"
gradientshapeok = "t" o:connecttype = "rect"></v:path><o:lock aspectratio="t"
v:ext="edit"></o:lock></v:shapetype><v:shape id=_x0000_i1037
style="WIDTH: 123.6pt; HEIGHT: 93.6pt" type = "#_x0000_t75" coordsize =
"21600,21600"><v:imagedata o:title="VSC4" src =
"VertexShaders_files/image001.png"></v:imagedata></v:shape><![endif]--><![if !vml]><img border=0 width=165 height=125
src="VertexShaders_files/image002.jpg" v:shapes="_x0000_i1037"><![endif]></SPAN></P>
<DIV class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US>
<HR align=center width="100%" SIZE=1>
</SPAN></DIV>
<H1><A name=顶点颜色></A><A name=_顶点颜色></A><SPAN
style="mso-bookmark: 顶点颜色">顶点颜色<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></H1><SPAN
style="mso-bookmark: 顶点颜色"></SPAN>
<DIV class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN; mso-bidi-font-family: 宋体">
<HR align=center width="100%" SIZE=1>
</SPAN></DIV>
<P class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><SPAN
style="FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN; mso-bidi-font-family: 宋体">本示例把顶点数据中的顶点颜色应用于物体。顶点数据包含了位置和漫反射色。这些数据如下所示:<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></P><PRE><SPAN class=SpellE><SPAN class=GramE><SPAN lang=EN-US style="FONT-SIZE: 10pt">struct</SPAN></SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"> CUSTOMVERTEX_POS_COLOR<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt">{<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"> </SPAN><SPAN class=GramE>float</SPAN><SPAN style="mso-spacerun: yes"> </SPAN>x, y, z;<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"> </SPAN>DWORD<SPAN style="mso-spacerun: yes"> </SPAN><SPAN class=SpellE>diffuseColor</SPAN>;<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt">};<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p> </o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt">// 创建包含位置和纹理坐标的顶点数据。<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt">CUSTOMVERTEX_POS_COLOR <SPAN class=SpellE>g_<SPAN class=GramE>Vertices</SPAN></SPAN><SPAN class=GramE>[</SPAN>]=<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt">{<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"> </SPAN>//<SPAN style="mso-spacerun: yes"> </SPAN>x<SPAN style="mso-spacerun: yes"> </SPAN>y<SPAN style="mso-spacerun: yes"> </SPAN>z<SPAN style="mso-spacerun: yes"> </SPAN>漫反射色<SPAN style="mso-spacerun: yes"> </SPAN><o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"> </SPAN>{ -1.0f, 0.25f, 0.0f, 0xffff0000,<SPAN style="mso-spacerun: yes"> </SPAN>},<SPAN style="mso-tab-count: 1"> </SPAN>//<SPAN style="mso-spacerun: yes"> </SPAN>右下 – 红<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"> </SPAN>{<SPAN style="mso-spacerun: yes"> </SPAN>0.0f, 0.25f, 0.0f, 0xff00ff00,<SPAN style="mso-spacerun: yes"> </SPAN>},<SPAN style="mso-tab-count: 1"> </SPAN>//<SPAN style="mso-spacerun: yes"> </SPAN>左下 – 绿<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"> </SPAN>{<SPAN style="mso-spacerun: yes"> </SPAN>0.0f, 1.25f, 0.0f, 0xff0000ff,<SPAN style="mso-spacerun: yes"> </SPAN>},<SPAN style="mso-tab-count: 1"> </SPAN>//<SPAN style="mso-spacerun: yes"> </SPAN>左上 – 蓝<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-spacerun: yes"> </SPAN>{ -1.0f, 1.25f, 0.0f, 0xffffffff,<SPAN style="mso-spacerun: yes"> </SPAN>},<SPAN style="mso-tab-count: 1"> </SPAN>//<SPAN style="mso-spacerun: yes"> </SPAN>右上 – 白<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt">};<o:p></o:p></SPAN></PRE>
<P class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><SPAN
style="FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN; mso-bidi-font-family: 宋体">顶点着色器声明也需要反映位置和颜色数据。<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></P><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt">// 创建着色器声明。<o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt">D3DVERTEXELEMENT9 <SPAN class=SpellE><SPAN class=GramE>decl</SPAN></SPAN><SPAN class=GramE>[</SPAN>] = <o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt">{<o:p></o:p></SPAN></PRE><PRE style="TEXT-INDENT: 20pt; mso-char-indent-count: 2.0"><SPAN class=GramE><SPAN lang=EN-US style="FONT-SIZE: 10pt">{ 0</SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">, 0,<SPAN style="mso-spacerun: yes"> </SPAN>D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },<o:p></o:p></SPAN></PRE><PRE style="TEXT-INDENT: 20pt; mso-char-indent-count: 2.0"><SPAN class=GramE><SPAN lang=EN-US style="FONT-SIZE: 10pt">{ 0</SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">, 12, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0 },<o:p></o:p></SPAN></PRE><PRE style="TEXT-INDENT: 20pt; mso-char-indent-count: 2.0"><SPAN lang=EN-US style="FONT-SIZE: 10pt">D3DDECL_<SPAN class=GramE>END()</SPAN><o:p></o:p></SPAN></PRE><PRE><SPAN lang=EN-US style="FONT-SIZE: 10pt">};<o:p></o:p></SPAN></PRE>
<P class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><SPAN
style="FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN; mso-bidi-font-family: 宋体">着色器得到变换矩阵的一种方法是通过常量寄存器,常量寄存器是通过调用<SPAN
class=SpellE><SPAN lang=EN-US>SetVertexShaderConstant</SPAN></SPAN>设置的。<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal
style="tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt"><SPAN
lang=EN-US
style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN; mso-bidi-font-family: 宋体">D3DXMATRIX
mat;<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt"><SPAN
class=GramE><SPAN lang=EN-US
style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN; mso-bidi-font-family: 宋体">D3DXMatrixMultiply(</SPAN></SPAN><SPAN
lang=EN-US
style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN; mso-bidi-font-family: 宋体">
&mat, &<SPAN class=SpellE>m_matView</SPAN>, &<SPAN
class=SpellE>m_matProj</SPAN> );<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt"><SPAN
class=GramE><SPAN lang=EN-US
style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN; mso-bidi-font-family: 宋体">D3DXMatrixTranspose(</SPAN></SPAN><SPAN
lang=EN-US
style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN; mso-bidi-font-family: 宋体">
&mat, &mat );<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt"><SPAN
class=GramE><SPAN lang=EN-US
style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN; mso-bidi-font-family: 宋体">hr</SPAN></SPAN><SPAN
lang=EN-US
style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN; mso-bidi-font-family: 宋体">
= m_pd3dDevice-><SPAN class=SpellE>SetVertexShaderConstantF</SPAN>( 1,
(float*)&mat, 4 );<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt"><SPAN
class=GramE><SPAN lang=EN-US
style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN; mso-bidi-font-family: 宋体">if(</SPAN></SPAN><SPAN
lang=EN-US
style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN; mso-bidi-font-family: 宋体">FAILED(hr))
<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt"><SPAN
lang=EN-US
style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN; mso-bidi-font-family: 宋体"><SPAN
style="mso-spacerun: yes"> </SPAN><SPAN
class=GramE>return</SPAN> hr;<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><SPAN
style="FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN; mso-bidi-font-family: 宋体">该声明声明了一个包含了位置和颜色数据的数据流。颜色数据被指定到寄存器<SPAN
lang=EN-US>1。以下是着色器代码。<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal
style="tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt"><SPAN
lang=EN-US
style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-fareast-language: ZH-CN; mso-bidi-font-family: 宋体">vs_1_1<SPAN
style="mso-spacerun: yes">
</SPAN>; 版本指令<o:p></o:p></SPAN></P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -