c++ - DirectX 后处理着色器

标签 c++ directx shader

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

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

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

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

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

最佳答案

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

关于c++ - DirectX 后处理着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1045675/

相关文章:

c++ - 如何从基类调用派生类函数?

c++ - 如何使用 header 中定义的输出流运算符

c++ - 模板类的友元函数中的链接错误

opengl - 如何从滚动,俯仰和偏航中获取摄像机的矢量?

c++ - 在 D3D12 上获取显示器的刷新率

c++ - 删除 Gtk Entry 上显示的自动弹出窗口

c++ - 如何在三个不同的 .cpp 文件中使用一个函数

unity3d - 是否有可能使着色器扩展 Unity 中的另一个着色器

java - OpenGL绘制三角形不显示+ glClearColor不设置屏幕颜色

loops - HLSL 中的数组长度?