- 1.当我在运行时向 ToolBar 分配一个 ImageList 时,为什么图像没有显示?
-
-
- 2.为什么我不能创建 ContextMenu 分隔符?
-
-
答案:
- 这是一个已知的 bug,即当在 ContextMenu 控件中添加一个 ContextMenu 项后,将它设为分隔符就会引发 NotSupportedException。问题在于 WinCE 有一个限制,即当 ContextMenu 的父级是一个控件时,向该 ContextMenu 添加一个菜单项后就不允许将该菜单项标记(更改)为分隔符。在 Visual Studio 2003 中,设计器分割设备项目的代码与在桌面上类似,都会产生这种问题。可以这样来解决:在一个独立于 InitilizeComponent 的方法中添加 ContextMenu。
- 此FAQ对你有帮助吗?[ 是 | 否 ] | 收藏 | 来源:Myprice价格网
- 3.如何启用一个应用程序的多个实例?
-
-
答案:
-
.NET Compact Framework 不支持多实例。以下代码示例提供了一种解决方案,它允许当启动应用程序时(但是已有一个运行着的实例)实例化而非最大化应用程序。
注:并非所有版本的 OS(包括未来版本)都支持以下代码,也不保证在所有这些版本中都能工作。
// C#
using System.Runtime.InteropServices; using System.Reflection; private void Form1_Load(object sender, System.EventArgs e) { this.Text = string.Format("Form {0}", new Random().Next()); } [DllImport("CoreDll")] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("CoreDll")] public static extern int SetWindowText(IntPtr hWnd, string lpString); protected override void OnResize(EventArgs e) { Assembly asm = System.Reflection.Assembly.GetExecutingAssembly(); IntPtr hWnd = FindWindow("#NETCF_AGL_PARK_", asm.GetModules()[0].FullyQualifiedName); if (hWnd != IntPtr.Zero) SetWindowText(hWnd, "#42"); base.OnResize (e); } 'VB Imports System.Runtime.InteropServices Imports System.Reflection Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles MyBase.Load Me.Text = String.Format("Form {0}", New Random().Next()) End Sub 'Form1_Load _ Public Shared Function FindWindow(ByVal lpClassName As String, _ ByVal lpWindowName As String) As IntPtr End Function _ Public Shared Function SetWindowText(ByVal hWnd As IntPtr, _ ByVal lpString As String) As Integer End Function Protected Overrides Sub OnResize(ByVal e As EventArgs) Dim asm As [Assembly] = System.Reflection.Assembly.GetExecutingAssembly() Dim hWnd As IntPtr = FindWindow("#NETCF_AGL_PARK_", _ asm.GetModules()(0).FullyQualifiedName) If hWnd.ToInt32() <> IntPtr.Zero.ToInt32() Then SetWindowText(hWnd, "#42") End If MyBase.OnResize(e) End Sub 'OnResize - 此FAQ对你有帮助吗?[ 是 | 否 ] | 收藏 | 来源:Myprice价格网
- 4.为什么我不能显示一个已经关闭了的窗体?
-
答案:
- 一旦一个窗体关闭,它就会被处置,因此可能被系统回收垃圾,所以试图显示已关闭的窗体是不安全的。一种替代的解决方案是使用 Form.Hide 和 Form.Show 来分别隐藏和显示窗体。
-
- 5.哪种关闭窗体的方法更合适:Application.Exit 还是 Form.Close?
-
-
答案:
-
Application.Exit 是一种强行退出方式,就像 Win32 的 PostQuitMessage()。它意味着放弃所有消息泵,展开调用堆栈,并将执���返回给系统。
在 Windows(Win32 或 .NET)中关闭应用程序的正确方式是关闭它的主应用程序窗口(例如 Form.Close)。主消息泵结束后依然存在的任何窗口都需要手动关闭。在应用程序退出之前通过调用 Form.Close 或 Form.Dispose 来关闭窗口是清除窗口的良好做法,但这需要您有意识地去做。我们需要记住,.NET Framework 的 OnClosing() 是 Win32 的托管版本的 WM_CLOSE,而非 WM_DESTROY。
另外,如果您使用 form.Close(),通过处理 OnClosing 或 OnClosed 事件,就可以让您的应用程序清理内容、关闭文件等。如果您通过 Application.Exit 强行退出应用程序,就无法调用这些事件。
- 此FAQ对你有帮助吗?[ 是 | 否 ] | 收藏 | 来源:Myprice价格网
- 6.我有一个含有许多控件的智能设备窗体。为什么会在运行时得到“NotSupportedException”?
-
-
答案:
-
如果您有一个含有许多控件的窗体,当您运行应用程序时可能会得到 NotSupportedException。如果您在调试器下运行,则可能会发现异常是由调用窗体构造函数中的 InitializeComponent() 引发的。您最可能遇到的一个事实是 Compact Framework CLR 硬性限制每个方法只有 64KB JITed 代码。这意味着当 CLR 将 IL 转换为方法(在本例中为 InitializeComponent 方法)时,产生的本机代码必须少于 64KB。如果产生的本机代码大于此值,则会引发 NotSupportedException。也可能出现的情况是,当在调试器下运行(例如通过 F5)时会看到异常,但不带调试器运行(通过 Ctrl-F5)时不会有异常。当 JITed 代码的大小非常接近于 64KB 限制时就会出现这种情况,因为调试器在运行时需要生成其他一些代码。
也可能出现的情况是,在设备中会产生这种异常,但在模拟器中不会(或反之),因为处理器家族之间 JITed 代码的大小有所不同(例如,许多基于 Windows Mobile 的 Pocket PC 设备使用 ARM 指令,而模拟器使用 x86 指令)。
超出此限制之前,窗体中可含有的控件数并没有一个固定的值。这是因为设计器生成的代码量因控件而异。例如,Button 控件通常生成的代码少于 TabControl 生成的代码,这取决于控件属性的设置方式。如果您通过属性网格中的生成器为控件填充集合,则拥有集合的控件(比如 ListBox 或 TreeView 控件)会生成大量代码。另外,本地化窗体(其 Localizable 属性设置为 True)中控件生成的代码会比非本地化窗体多,因为 InitializeComponent 中生成的代码会根据来自资源文件的值设置属性,而不是使用硬编码的值。
如果您碰到这种问题,有几种不同的技术可以使用:
将一个窗体分割成多个窗体。将大量控件放在一个窗体中对窗体加载和应用程序启动时间也有不利的影响。如果可能,要将 UI 分在两个或更多的窗体中。
不要通过设计时生成器填充大的内部控件集合。例如,如果您在 TreeView 控件的 Nodes 集合中添加许多节点,就会在 InitializeComponent 方法中额外添加大量代码。如果可能,应该移动这些代码,使集合填充到构造函数或 Form.Load 事件处理程序中。这种技术的缺点是集合将无法很容易地通过设计器编辑,但有助于调整生成代码的大小。
不要将自己的代码添加到 InitializeComponent 方法中。这通常是一个很好的指导原则,因为在这个方法中修改或添加由设计器生成的代码是不受支持的。这样做也会导致设计器中出现意外行为。如果您要将自己的自定义启动代码添加到窗体中,就应该将它放在构造函数或 Form.Load 事件处理程序中。
在运行时以编程方式初始化类似的控件。例如,如果您创建了 12 个 Button 控件,它们只有 Text 和 Position 属性不同,则您可以考虑通过一个循环来创建和初始化,而不是让这 12 个控件都在设计器生成的代码中创建和初始化。另外,如果您自己编写代码实现,不要将代码放在 InitializeComponent 中。
修改 InitializeComponent 的一个令人遗憾的负面影响是:在 InitializeComponent 外的代码中实例化的任何控件都无法使用窗体设计器编辑。另外,如果您手动编辑 InitializeComponent 中的代码,则会发现设计器可能无法正确解释您修改过的代码,从而不再呈现窗体。基于这些原因,最好选择上面列出的不修改 InitializeComponent 的解决办法。
- 此FAQ对你有帮助吗?[ 是 | 否 ] | 收藏 | 来源:Myprice价格网
- 7.何时应该使用窗体构造函数,何时应该使用 Load 函数?
-
-
- 8.如何以编程方式替换全局程序集缓存 (GAC) 中的程序集?
-
-
- 9.如何将 imgdecmp.dll 包括在模拟器映像中?
-
-
- 10.什么是 .NET Compact Framework 的足迹?
-
-
- 11.如何确定设备中安装的 .NET Compact Framework 的版本?
-
-
答案:
-
发行的每个 .NET Compact Framework 版本都有一个不同的 Win32 文件版本号(它是与程序集版本相独立的版本号,对于发行的所有 .NET Compact Framework 第一版(包括 Service Pack),这两者应该是一样的)。
要查看安装的是什么版本,可以使用文件资源管理器,定位于设备的 \Windows 目录,并单击名为 CGACUTIL 的文件。将会弹出一个消息框,显示安装在设备中的 .NET Compact Framework 的 Win32 文件版本。
RTM = 1.0.2268.0SP1 = 1.0.3111.0SP2 Recall = 1.0.3226.0SP2 Beta = 1.0.3227.0SP2 Final = 1.0.3316.0要以编程方式确定版本,可以使用 System.Environment.Version.ToString()。
要通过桌面安装程序确定版本,请参见本 FAQ 中标题为 “3.10.如何通过桌面安装程序检测 .NET Compact Framework 的版本?”的项。
- 此FAQ对你有帮助吗?[ 是 | 否 ] | 收藏 | 来源:Myprice价格网
- 12.所有这些 ARM 二进制是些什么?
-
-
答案:
-
XScale 支持 ARM v5 指令集,不过它也向后兼容 ARMv4 指令集。它有三个变种:
ARMv4 -> 它只支持 32 位 ARMv4 指令
ARMv4T ->“T”代表 Thumb。Thumb 是 ARM 16 位指令模式
ARMv4I ->“I”代表交互作用 (Interworking)。它允许 32 位指令和 16 位指令共存
对于其他的 ARM 处理器:
StrongARM (SA1110) -> 只支持 ARMv4 指令
ARM920T 等 -> 通常支持这三个变种
.NET Compact Framework 将提供三组用于 ARM 的二进制。
用于基于 Windows Mobile 2000 和基于 Windows Mobile 2002 的 Pocket PC 2002 的 ARMv4。它将运行 ARM 设备(包括 Xscale)的所有 ARM。部署到这些设备中的 cab 只能在名称中包含“arm”。
用于 Windows CE.NET 的 ARMv4。它将运行在通过 Platform Builder 中的 ARMv4 内核编译的 Windows CE.NET 设备中。它也是用于基于 Windows Mobile 的 Pocket PC 2003 的二进制。为这些设备部署的 cab 在名称中包含“armv4”。
用于 Windows CE.NET 的 ARMv4T 或 ARMv4I。它将运行在通过 Platform builder 中的 ARMv4T 或 ARMv4I 内核编译的 Windows CE.NET 设备中。部署到这些设备中的 cab 在名称中包含“armv4T”。
- 此FAQ对你有帮助吗?[ 是 | 否 ] | 收藏 | 来源:Myprice价格网
- 13.如何设置模拟器属性?
-
-
- 14.如何指定在每次调试器运行时不必复制依赖文件?
-
-
- 15.以后 .NET Compact Framework 将会支持什么设备?
-
-
答案:
-
不久以后,.NET Compact Framework 将会作为一个操作系统 (OS) 组件,在所有的 Microsoft 智能设备中提供,包括将来基于 Windows Mobile 的 Pocket PC 设备、基于 Windows Mobile 的 Pocket PC Phone Edition、基于 Windows Mobile 的 Smartphone、Windows CE for Automotive 和 MSTV。每种特定设备的具体时间选择将由各个产品发布周期确定。
Windows CE .NET 4.1 也支持 .NET Compact Framework,将其作为一个集成的 OS 组件,因此允许 OEM 使用 Platform Builder 工具将 .NET Compact Framework 嵌入到所有装备 Windows CE 的新设备中。
- 此FAQ对你有帮助吗?[ 是 | 否 ] | 收藏 | 来源:Myprice价格网
- 16.NET Compact Framework 支持什么设备?
-
-
- 17.开发 .NET Compact Framework 应用程序需要什么工具?
-
-
- 18.什么是 Microsoft .NET Compact Framework?
-
-
- 19.IDirectPlay8LobbyClient::Initialize 为何返回 DPNERR_NOTALLOWED?
-
-
- 20.DPNSVR 是做什么用的?
-
-
答案:
- DPNSVR 是一种用于枚举请求的转发服务,消除了多个 DirectPlay 应用程序在端口使用上的冲突所导致的各种问题。使用 DPNSVR 使得 DirectPlay 能够自动选择要使用的端口,同时又允许客户端对您的游戏进行枚举。默认为,DirectPlay 会使用 DPNSVR,因为这通常为应用程序提供了最大的灵活性;但是,您可以将其禁用,方法是在创建您的会话时指定 DPNSESSION_NODPNSVR 标志。如果客户端使用 DPNSVR 端口来枚举主机,而主机又使用自己的端口来作出响应的话,使用 DPNSVR 可能会导致客户端一侧的 NAT 发生问题;NAT 可能会拒绝将数据包转递给客户端,因为数据包不是来自请求被发往的同一端口。
- 此FAQ对你有帮助吗?[ 是 | 否 ] | 收藏 | 来源:Myprice价格网
- 21.我如何确保我的游戏将能够与各种网络地址转换器和Internet连接共享设置正常工作?
-
-
答案:
- 网络地址转换器(Network Address Translator,NAT)和Internet连接共享(Internet Connection Sharing,ICS)是较为复杂的主题,在 MSDN 上的另一篇文章中有更详尽的论述。但是,下列提示可以作为
很好的一般性指导:Nats2-msdn.htm。 ·通过 IDirectPlay8Client 和 IDirectPlay8Server 接口,使用一种客户端 — 服务器而不是点对点网络拓扑。 ·将服务器放在清澈的 Internet 上,而不是在一个 NAT 后面。 ·直接枚举游戏端口,而不是使用 DPNSVR。 ·不要在您的消息中内嵌 IP 地址或端口号。有关点对点游戏、将服务器驻于 NAT 后面的事宜,以及针对各种不同的 Windows 操作系统上的 ICS 的具体建议,请参考更详尽的文档。
- 此FAQ对你有帮助吗?[ 是 | 否 ] | 收藏 | 来源:Myprice价格网
- 22.我的应用程序启动时,为何为发出一阵净噪声?
-
-
- 23.对于字体描绘,我应当使用 ID3DXFont 还是 SDK 框架 CD3DFont 类?
-
-
- 24.D3DX 中的文字描绘函数好象失效,我的操作有什么问题吗?
-
-
- 25.D3DX 图象文件加载器函数支持哪些文件格式?
-
答案:
- D3DX 图象文件加载器函数支持 BMP、TGA、PNG、JPG、DIB、PPM 和 DDS 文件。
-
- 26.如果我要生成动态数据,怎样才算是较好地使用顶点缓冲区了呢?
-
-
答案:
- 具体的实施步骤。
借助 D3DUSAGE_DYNAMIC 和 D3DUSAGE_WRITEONLY 使用标志以及 D3DPOOL_DEFAULT 缓冲池标志来创建一个顶点缓冲区。(如果您正使用软件顶点处理功能的话,还要指定 D3DUSAGE_SOFTWAREPROCESSING) I = 0 设置状态(纹理、描绘状态等) 检查缓冲区内是否有空间,即 i.e.I + M <= N? (其中 M 是新顶点的数目) 如果为真,则借助 D3DLOCK_NOOVERWRITE 对 VB 进行 Lock (锁定)。这告知 Direct3D 和驱动程序,您将要添加顶点,而并不修改您先前批处理过的顶点。因此,如果当时正在进行一项DMA 操作,则并不中断该操作。否则,转至 11 在 I 处填充 M 个顶点 解锁 (Unlock) 调用 Draw[Indexed]Primitive。对于未经索引的,请将 I 用作 StartVertex 参数。对于已编索的基本类型,请确保索引指向顶点缓冲区的正确部分(要做到这一点,使用 SetIndices 调用的 BaseVertexIndex 参数可能最为容易) I + = M 转到 3 好,空间已用尽,就让我们开始一个新的顶点缓冲区。我们不想使用同一个顶点缓冲区,因为有可能有一个 DMA 操作正在进行之中。我们将这一情形告知 Direct3D, 方法是借助 D3DLOCK_DISCARD 标志,将“同一个”顶点缓冲区锁定。这意思是,“你可以给我一个新的指针了,因为我已用完旧的指针,不再在意旧的内容。” I = 0 转至 4(或 6)
- 此FAQ对你有帮助吗?[ 是 | 否 ] | 收藏 | 来源:Myprice价格网
- 27.我应当使用哪些基本类型(条形、扇形、列表等)?
-
-
答案:
- 在真实数据中遇到的许多网格,都具有多个多边形共享顶点的特性。为将性能最大化,最好将所转换的顶点中的重复率降低,并横跨总线将其发给描绘设备。使用简单的三角列表根本实现不了任何顶点共享,因而这是最不理想的方法。这一点已很清楚。然后所要作的选择就是使用条形和扇形(暗示多边形之间的具体连接关系),还是使用索引列表。在数据自然归入各种条形和扇形的情况下,这些就是最为合适的选择,因为发给驱动程序的数据被降至最低。但是,将网格分解条形和扇形经常会造成大量分离块,暗示有大量的 DrawPrimitive 调用。因此,最富效率的方法通常是使用带三角列表的单独一个 DrawIndexedPrimitive 调用。使用索引列表的另一个优势就是,这在连续三角形仅共享单独一个顶点时也有益处。总而言之,如果您的数据自然归入各种较大的条形和扇形,就使用条形和扇形,否则就使用索引列表。
- 此FAQ对你有帮助吗?[ 是 | 否 ] | 收藏 | 来源:Myprice价格网
- 28.我如何能够改善我的 Direct3D 应用程序的性能?
-
-
答案:
- 在优化性能时,需要考察下列几个关键问题: ·批处理大小 Direct3D 已为大批量原语进行过优化。一次调用所能发送的多边形越多,其效果也就越好。凭经验而论,建议平均每次调用100 个以上的多边形。低于该水平,您可能不会得到最好的性能,而高于该水平,您收到的效果会递减,且可能会与并行事项发生冲突(参见下面的论述)。 ·状态更改 更改描绘状态这种操作可能会很昂贵,尤其是在更改纹理时。因此,每帧所作的状态更改应尽可能地少,这一点很重要。另外,请尽量降低对顶点或索引缓冲区的更改。注意:在 DirectX 中更改缓冲区已不在象在以前版本中那样昂贵了,但依旧建议尽量避免更改顶点缓冲区。 ·并行 如果能够安排描绘与其它处理同时进行,则您可以充分利用系统性能。这一目标可能会与降低描绘状态更改的目标相抵触。您需要在进行批处理以降低状态更改和较早将数据推出到驱动程序以达到并行目的之间找到一个平衡点。以循环方式使用多个顶点缓冲区,会有助于并行功能。 ·纹理上载 将纹理上载到设备会消耗带宽并导致与顶点数据争用带宽。因此,不要占用过多的内存这一点很重要,因为这会强制缓存方案为每一帧上载过多的纹理。 ·顶点缓冲区和索引缓冲区 您应当一直使用顶点缓冲区和索引缓冲区,而不是由应用程序分配的普通内存块。顶点缓冲区和索引缓冲区的锁定语义至少可以避免多于的复制操作。对于某些驱动程序,顶点缓冲区和索引缓冲区可能是更理想的存储器中的某些区域(可能是在视频或 AGP 存储器中),供硬件进行访问。 ·状态宏锁定 这些是在 DirectX 7.0 中推出的,为将一系列的状态更改(包括照明、材质和矩阵更改)记录成一个宏提供了一个机制,该宏然后就可以通过单一的调用来重放了。这有两个优势: 您进行一次调用而不是多次调用,从而降低调用开销。 有感悟能力的驱动程序可以对状态更改进行预分析和预编译,从而使到图形硬件的提交速度快得多。状态更改可能依旧很昂贵,但使用状态宏至少会有助于降低部分成本。 ·仅使用单独一个 Direct3D 设备 如果您需要描绘到多个目标,则请使用 SetRenderTarget。如果您是要创建一个带有多个 3D 窗口的窗口化程序,则请使用 CreateAdditionalSwapChain API。运行时已为单一设备进行过优化,使用多个设备时会有相当多的速度折扣。
- 此FAQ对你有帮助吗?[ 是 | 否 ] | 收藏 | 来源:Myprice价格网
- 29.将多重顶点流用于固定功能流水线有何限制?
-
-
- 30.索引缓冲区是什么?
-
-
答案:
- 索引缓冲区与顶点缓冲区极其类似,但其包含的是用于 DrawIndexedPrimitive 调用的索引。强烈建议您尽可能使用索引缓冲区,而不要使用原始的由应用程序分配的内存,其道理与顶点缓冲区相同。
我注意到 32 位的索引现在是一种支持类型;我可以将其用在所有的设备上吗? 不可以。你必须检查 D3DCAPS8::MaxVertexIndex 字段,以确定设备所支持的最大索引值。该值必须大于 216-1 (0xffff)才能支持 D3DFMT_INDEX32 类型的索引缓冲区。另外请注意,某些设备可能支持 32 位的索引,但其所支持的最大索引值却小于 232- 1 (0xffffffff);这样,应用程序必须遵从设备所报告的限制。 - 此FAQ对你有帮助吗?[ 是 | 否 ] | 收藏 | 来源:Myprice价格网
- 31.在我提交一列带索引的原语时,Direct3D是处理缓冲区中所有的顶点,还是只处理我索引过的顶点?
-
-
- 32.我可以在带有不同纹理坐标的顶点之间共享位置数据吗?
-
答案:
- 该情形的一个通常示例就是一个立方体,其中您想为每个面使用一个不同的纹理。很不幸,答案是不行;目前还还不能独立索引每个顶点组件。即使是多顶点流,也是所有的顶点一起索引。
-
- 33.有多少个常量寄存器可以用于顶点着色器?
-
答案:
- 要求支持 DX8 顶点着色器的设备至少支持 96 个常量寄存器。设备的支持能力可能会超过这一最低数目,且可以通过 D3DCAPS8::MaxVertexShaderConst 字段进行报告。
-
- 34.我如何确定硬件是否支持我的定制的顶点着色器?
-
-
- 35.如果我的硬件并不支持定制的顶点着色器,我可以使用吗?
-
答案:
- 可以。Direct3D 软件顶点处理引擎完全支持定制的顶点着色器,且性能指标出奇的高。
-
- 36.我能将一个定制的顶点着色器应用到固定功能几何流水线(或者进行相反的操作)吗?
-
答案:
- 不能。您必须选择其一。如果您正在使用一个定制的顶点着色器,则您负责进行整个顶点变换操作。
-
- 37.我能借助顶点着色器生成几何图形吗?
-
-
- 38.顶点着色器进行透视划分或剪裁吗?
-
答案:
- 不。顶点着色器在已变换的顶点位置的剪贴空间输出一个纯系坐标。透视分割和剪裁是由后着色器自动进行的。
-
- 39.顶点着色器是什么?
-
-
- 40.我对顶点流不大清楚,其工作原理如何?
-
-
- 41.D3DVERTEX 等等顶点类型有何变动?
-
答案:
- 不再显式支持“预罐装”的顶点类型。多重顶点流系统允许对顶点数据进行更加灵活的装配。如果您想使用其中一个“传统”的顶点格式,则您可以建立一套相应的FVF 代码。
-
- 42.我如何枚举多监视器系统中的所有显示设备?
-
-
答案:
- 与其它的枚举功能相同,该功能已从基于回调变为由应用程序借助 IDirect3D8 接口的各种方法来进行简单的反复。调用 GetAdapterCount 来确定系统中显示适配器的数目。调用 GetAdapterMonitor 来确定适配器所连接的物理监视器(该方法返回一个HMONITOR,您然后就可以在 Win32 API GetMonitorInfo 中使用该值,以确定关于物理监视器的信息)。确定某一具体显示适配器的特征,或在该适配器上创建一个 Direct3D 设备,简单到在调用 GetDeviceCaps、CreateDevice 或其它方法时,通过替代 D3DADAPTER_DEFAULT 来传递相应的适配器编号。
- 此FAQ对你有帮助吗?[ 是 | 否 ] | 收藏 | 来源:Myprice价格网
- 43.我如何使用颜色键控?
-
答案:
- DirectX 8 并不支持颜色键控。您应当换用 alpha 混色/测试,大体上这是一个更加灵活的技巧,没有与颜色键控相关的一些问题。
-
- 44.D3DCREATE_PUREDEVICE 标志有何用途?
-
-
- 45.Texel(特塞尔)对齐规则是什么?我怎样才能得到一一映射?
-
-
- 46.我如何使用模板缓冲区来描绘阴影量?
-
-
答案:
- 这一效果以及其它体积模板缓冲区效果的关键在于模板缓冲区和 z 缓冲区之间的交互作用。带有阴影量的场景是分三个阶段描绘的。首先,照常使用 z 缓冲区来描绘没有阴影的场景。然后,在模板缓冲区中将阴影标出,如下所示。使用不可见的多边形绘制阴影量的正面,其中 z 测试被启用,而 z 写入被禁用,且在每有一个像素通过 z 测试时,就将模板缓冲区增加一次。以同样方式描绘阴影量的背面,但是要减少模板值。
现在,请考虑单独一个像素的情形。假设摄像机不在阴影量中,场景中的相应点就有有四种可能性。如果从摄像机到点的光线不与阴影量相交,则不会绘制任何的阴影多边形,而模板缓冲区依旧为零。否则,如果点在阴影量的前面,则阴影多边形会被输出 z 缓冲区,而模板依旧保持不变。如果点位于阴影量下面,则会描绘同样多的正面阴影,而模板为零,即增加的次数与减少的次数一样多。
最后一种可能性就是点位于阴影量中。在这种情况下,阴影量的背面会被输出 z 缓冲区,但正面则不然,因而模板缓冲区会为非零。结果就是,帧缓冲区位于阴影中的一些部分具有非零的模板值。最后,要实际描绘阴影,整个场景会被一个 alpha 混色的多边形集充溢一遍,其中仅模板值非零的像素受到影响。在随 DirectX SDK 一起提供的 “Shadow Volume”示例中有关于该技巧的一个示例。 - 此FAQ对你有帮助吗?[ 是 | 否 ] | 收藏 | 来源:Myprice价格网
- 47.模板缓冲区是什么?
-
-
- 48.我如何防止透明的像素被写到 z 缓冲区?
-
答案:
- 您可以借助高于或低于某一给定门限的 alpha 值来将像素滤除。您通过描绘状态 ALPHATESTENABLE、ALPHAREF 和 ALPHAFUNC 来控制这一操作。
-
- 49.Direct3D 几何代码使用 3DNow!或 Pentium III SIMD 指令吗?
-
-
- 50.Direct3D 包含有软件光栅器吗?
-
答案:
- 没有。Direct3D 现在支持插件式软件光栅器。但是,目前并不默认提供任何软件光栅器。
-