代码之家  ›  专栏  ›  技术社区  ›  ssube

DirectX后处理明暗器

  •  1
  • ssube  · 技术社区  · 17 年前

    我有一个简单的应用程序,我需要让用户选择一个明暗器(.fx hlsl或汇编文件,可能有多个过程,但全部和唯一的像素明暗器)并预览它。

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

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

    在过去的几天里,我试着让它工作,但没有明显的原因,用于呈现每个效果的相同代码块只呈现第一个效果。我可以将第二个明暗器文件添加为第一个明暗器文件中的第二个步骤,它运行得很完美(尽管完全违背了我预览用户创建的明暗器的目标)。当我尝试使用第二个效果(加载和编译都很好)时,它什么也不做。 我已经获取了第一个材质球的结果(使用getrenderTargetData)并将其放置在纹理和曲面(destex和destsur)中,然后将该纹理设置为第二个过程的输入(使用dev->set texture和更高的effect->set texture(“thisframe”,destex))。

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

    3 回复  |  直到 16 年前
        1
  •  1
  •   Daniel Dimovski    16 年前

    每次渲染四元体后,尝试清除深度模具缓冲区。

        2
  •  1
  •   gufftan    16 年前

    首先创建一个纹理,然后将第一个材质球直接渲染到该纹理中。最后渲染第二个材质球,并将纹理作为backbuffer的输入。

        3
  •  0
  •   Jesse Hall    17 年前

    为了运行像素明暗器,必须有某种类型的顶点输入和顶点处理(固定函数或明暗器)。是否提供顶点明暗器,如果是,是否确定它符合像素明暗器的预期?你的抽签叫什么?

    在尝试使用用户效果时,可能需要查看应用程序的pix跟踪来查看设备状态。