1

我有一个简单的应用程序,我需要让用户在其中选择一个着色器(.fx HLSL 或程序集文件,可能有多个通道,但只有像素着色器)并预览它。

应用程序运行,着色器列表出现,一个按钮启动“预览窗口”。从这个预览窗口(其中有一个 DirectX 视口)中,用户选择一个图像,着色器在该图像上运行并显示。只有一帧需要渲染(不是实时的)。

我设置了一个顶点/像素着色器组合,它采用四边形并将其渲染到屏幕上,并使用所选图像进行纹理化。这完美地工作。然后我需要在第一个效果的输出上运行另一个效果,纯像素着色器,并将最终图像(后处理)显示到屏幕上。这根本行不通。

在过去的几天里,我一直在尝试让它工作,但没有明显的原因,用于渲染每个效果的相同代码块只渲染第一个。我可以在第一个着色器文件中添加第二个着色器文件作为第二个通道,它运行完美(尽管完全违背了我预览用户创建的着色器的目标)。当我尝试使用第二个效果(加载和编译得很好)时,它什么也没做。我已经获取了第一个着色器的结果(使用 GetRenderTargetData)并将它们放置在纹理和表面(destTex 和 destSur)中,然后将该纹理设置为第二遍的输入(使用 dev->SetTexture 和后来的效果-> SetTexture("thisframe", destTex))。

所有调用成功,效果编译,纹理加载,四边形绘制,但效果不可见。起初我怀疑是设备(使用软件顶点处理创建)导致了问题,但似乎并非如此(我尝试使用硬件并混合)。此外,同时使用 HAL 和 REF 设备(不是问题,因为应用程序不是实时的),第二个着色器不可见。Direct3D 9 的一切都是用 C++ 编写的。

4

3 回答 3

1

首先创建一个纹理,然后将第一个着色器直接渲染到该纹理中。最后使用纹理作为 Backbuffer 的输入来渲染第二个着色器。

于 2009-07-07T14:16:48.057 回答
1

每次渲染四边形后尝试清除深度模板缓冲区。

于 2010-03-06T00:06:54.367 回答
0

必须有某种顶点输入和顶点处理(固定函数或着色器)才能运行像素着色器。您是否提供了顶点着色器,如果是,您确定它符合像素着色器的预期吗?你的draw call是什么样的?

可能值得查看应用程序的 PIX 跟踪,以了解尝试使用用户效果时的设备状态。

于 2009-06-28T07:08:26.963 回答