📄 视区和裁剪viewports and clipping.htm
字号:
style="FONT-SIZE: 10pt; FONT-FAMILY: Symbol; mso-bidi-font-family: Symbol; mso-fareast-language: ZH-CN; mso-fareast-font-family: Symbol; mso-bidi-font-size: 12.0pt"><SPAN
style="mso-list: Ignore">·<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN></SPAN><![endif]><U><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN"><A
href="http://www.gesoftfactory.com/developer/VnC.htm#手工变换顶点">手工变换顶点</A></SPAN></U><SPAN
lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN"><o:p></o:p></SPAN></P>
<DIV class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">
<HR align=center width="100%" SIZE=1>
</SPAN></DIV>
<P class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 1"><A
name=设置视区裁剪体><B><SPAN
style="FONT-SIZE: 24pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 18.0pt; mso-fareast-language: ZH-CN">设置视区裁剪体<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></B></A></P><SPAN
style="mso-bookmark: 设置视区裁剪体"></SPAN>
<DIV class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">
<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-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">要给一个渲染设备配置视区参数的唯一要求是设置视区的裁剪体。要完成这个任务,首先初始化裁剪体和渲染目标表面,并给它们设置裁剪值。视区一般被设置成渲染目标表面的整个区域,但这不是必需的。<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">C++应用程序可以对<U>D3DVIEWPORT9</U>结构的成员使用以下设置。<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-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">D3DVIEWPORT9
viewData = { 0, 0, width, height, 0.0f, 1.0f };<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-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">给<B
style="mso-bidi-font-weight: normal"><SPAN
lang=EN-US>D3DVIEWPORT9</SPAN></B>结构赋值之后,通过调用<U><SPAN
lang=EN-US>IDirect3DDevice9::SetViewport</SPAN></U>方法会把视区参数应用于设备。以下示例代码显示了这个调用。<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-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">HRESULT
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-bidi-font-family: 宋体; mso-fareast-language: ZH-CN"><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-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">hr
= pd3dDevice->SetViewport(&viewData);<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-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">if(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-bidi-font-family: 宋体; mso-fareast-language: ZH-CN"><SPAN
style="mso-spacerun: yes"> </SPAN>return
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-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">如果调用成功,视区参数就设置完成并会在下一次渲染方法被调用时生效。要改变视区的参数,只要更改<B
style="mso-bidi-font-weight: normal"><SPAN
lang=EN-US>D3DVIEWPORT9</SPAN></B>结构的值并再次调用<B><SPAN
lang=EN-US>IDirect3DDevice9::SetViewport</SPAN></B>方法。<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal><B style="mso-bidi-font-weight: normal"><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">注意<SPAN
lang=EN-US><SPAN style="mso-tab-count: 1">
</SPAN>D3DVIEWPORT9</SPAN></SPAN></B><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">结构的<B
style="mso-bidi-font-weight: normal"><SPAN lang=EN-US>MinZ</SPAN></B>和<B
style="mso-bidi-font-weight: normal"><SPAN
lang=EN-US>MaxZ</SPAN></B>成员指出在这个深度范围内的场景将被渲染,它们不用于裁剪。大多数应用程序将这两个成员设置为<SPAN
lang=EN-US>0.0和1.0,使用系统渲染深度缓存中全部范围的深度值。在一些情况下,应用程序可以通过使用其它的深度范围实现特殊效果。例如,要在游戏中显示提示,应用程序可以把两个值都设为0.0,强制系统渲染场景中最前面的物体,或者也可以把它们都设为1.0,渲染总是在最后面的物体。<o:p></o:p></SPAN></SPAN></P>
<DIV class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">
<HR align=center width="100%" SIZE=1>
</SPAN></DIV>
<P class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 1"><A
name=清除视区><B><SPAN
style="FONT-SIZE: 24pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 18.0pt; mso-fareast-language: ZH-CN">清除视区<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></B></A></P><SPAN
style="mso-bookmark: 清除视区"></SPAN>
<DIV class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">
<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-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">清除视区会重置渲染目标表面中视区矩形内的内容,如果指定的话,还可以重置深度缓存和模板缓存表面中相应矩形区域中的内容。一般来说,为了保证图形和其它数据(渲染目标表面和深度<SPAN
lang=EN-US>/模板缓存表面)都会接受新的渲染物体而不会显示遗留物,应用程序要在渲染新的一帧前清除视区。<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">C++开发人员可以用<U>IDirect3DDevice9</U>接口提供的<U>IDirect3DDevice9::Clear</U>方法清除视区。该方法接收一个或多个定义表面中需要被清除区域的矩形。万一正在渲染的场景包含穿越整个视区矩形的运动——例如,在一个第一人称视角的游戏中——应用程序可能希望每帧清除整个视区。在这种情况下,应用程序将<I
style="mso-bidi-font-style: normal">Count</I>参数设为1,将<I
style="mso-bidi-font-style: normal">pRect</I>参数设为覆盖整个视区的矩形的地址。如果这样更方便,应用程序也可以将<I
style="mso-bidi-font-style: normal">pRect</I>参数设为NULL,将<I
style="mso-bidi-font-style: normal">Count</I>参数设为0,表示要清除整个视区矩形。<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><B><SPAN
lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">IDirect3DDevice9::Clear</SPAN></B><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">方法很灵活,它提供了对清除深度缓存中的模板缓存的支持。<I
style="mso-bidi-font-style: normal"><SPAN
lang=EN-US>Flags</SPAN></I>参数接收三个标志,确定怎样清除渲染目标及相关的深度缓存和模板缓存。如果<I
style="mso-bidi-font-style: normal"><SPAN lang=EN-US>Flags</SPAN></I>参数包含<SPAN
lang=EN-US>D3DCLEAR_TARGET标志,该方法用<I
style="mso-bidi-font-style: normal">Color</I>参数(不是材质颜色)中指定的RGBA颜色值清除视区。如果<I
style="mso-bidi-font-style: normal">Flags</I>参数包含D3DCLEAR_ZBUFFER标志,该方法用<I
style="mso-bidi-font-style: normal">Z</I>参数中指定的深度值清除深度缓存,0.0是最近的距离,1.0是最远的距离。如果<I
style="mso-bidi-font-style: normal">Flags</I>参数包含D3DCLEAR_STENCIL标志,该方法用<I
style="mso-bidi-font-style: normal">Stencil</I>参数中指定的值清除模板缓存。应用程序可以使用从0到2的<I
style="mso-bidi-font-style: normal">n</I>次方减1范围内的整数,<I
style="mso-bidi-font-style: normal">n</I>是模板缓存的位数。<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal><B style="mso-bidi-font-weight: normal"><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">注意<SPAN
lang=EN-US><SPAN style="mso-tab-count: 1"> </SPAN></SPAN></SPAN></B><SPAN
lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">Microsoft
DirectX® 5.0允许背景材质具有关联的纹理,这可以将视区清除为一张纹理而不是一个单纯的颜色。这项特性很少使用,实际上效率也不高。从DirectX®
6.0开始及后续的接口不再接受纹理句柄,这意味着应用程序不能再用一张纹理清除视区。更确切地讲,应用程序现在必须手工绘制背景。因此,很少需要清除渲染目标表面上的视区。只要应用程序清除了深度缓存,渲染目标表面上的所有像素都将被覆盖。<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-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">在一些情况下,应用程序可能希望只渲染到渲染目标和深度缓存表面的一小部分。清除方法同样允许应用程序在单个调用中清除表面中的多个区域。要完成这个任务,将<I
style="mso-bidi-font-style: normal"><SPAN
lang=EN-US>Count</SPAN></I>参数设置为希望清除的矩形区域的数量,并把<I
style="mso-bidi-font-style: normal"><SPAN
lang=EN-US>pRects</SPAN></I>参数设为矩形数组中第一个矩形的地址。<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<DIV class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">
<HR align=center width="100%" SIZE=1>
</SPAN></DIV>
<P class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 1"><A
name=手工变换顶点><B><SPAN
style="FONT-SIZE: 24pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 18.0pt; mso-fareast-language: ZH-CN">手工变换顶点<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></B></A></P><SPAN
style="mso-bookmark: 手工变换顶点"></SPAN>
<DIV class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">
<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-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">在<SPAN
lang=EN-US>Microsoft®
Direct3D®应用程序中,可以使用三种顶点。更多有关顶点格式的细节请参阅<U>顶点格式</U>。<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">应用程序可以用顶点缓存从简单顶点类型转到复杂顶点类型。顶点缓存是为了进行高速渲染,用来有效地存储并处理大批量顶点的对象,并经过优化可以充分利用特定处理器的特性。要用<U><SPAN
lang=EN-US>IDirect3DDevice9::ProcessVertices</SPAN></U>方法执行顶点变换。<B><SPAN
lang=EN-US>IDirect3DDevice9::ProcessVertices</SPAN></B>只接收未经变换的顶点,也可以有选择地对顶点执行光照计算和裁剪。光照计算在应用程序调用<B><SPAN
lang=EN-US>IDirect3DDevice9::ProcessVertices</SPAN></B><SPAN
style="mso-bidi-font-weight: bold">方法时执行,但裁剪在渲染时执行。</SPAN><SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">在处理完顶点之后,应用程序可以使用特殊的渲染方法渲染顶点,或者也可以通过锁定顶点缓存直接存取它们。更多有关使用顶点缓存的信息,请参阅<U>顶点缓存</U>。<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<DIV class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-fareast-language: ZH-CN">
<HR align=center width="100%" SIZE=1>
</SPAN></DIV>
<P class=MsoNormal><SPAN lang=EN-US
style="mso-fareast-language: ZH-CN"><o:p> </o:p></SPAN></P></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -