2009-06-25 111 views
1

我有一个简单的应用程序,我需要让用户选择一个着色器(.fx HLSL或程序集文件,可能有多遍,但只有所有像素着色器)并预览它。DirectX后期处理着色器

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

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

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

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

回答

1

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

0

为了让像素着色器运行,必须有某种顶点输入和顶点处理(固定功能或着色器)。你是否提供了顶点着色器,如果是的话,你确定它做了像素着色器的期望?你的平局看起来像什么?

当您试图使用用户效果时,可能需要查看应用的PIX跟踪以查看设备状态。

1

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