Direct3D纹理后处理/复制

时间:2009-10-15 20:53:48

标签: c++ directx direct3d direct3d9

所以我正在尝试实现一些Direct3D后期处理,而且我在渲染纹理方面遇到了问题。基本上,我的程序看起来像这样:

// Render scene to "scene_texture" (an HDR texture)...

...

device->SetRenderTarget(0, brightpass_surface);
device->SetTexture(0, scene_texture);
// Render "scene_texture" to "brightpass_texture" using full-screen quad.
// This involves passing the quad geometry through a brightpass shader.

...

device->SetRenderTarget(0, ldr_surface);
device->SetTexture(0, brightpass_texture);
// Render "brightpass_texture" to "ldr_surface" using full-screen quad...

我遗漏了一些部分b / c有相当数量的代码(我只是试图了解一般的想法)。不幸的是,上面的结果是空白屏幕。这就是我想要发生的事情:

  1. 将场景渲染为纹理(HDR)
  2. 通过brightpass着色器将纹理渲染到第二个纹理
  3. 将第二个纹理渲染到可见的LDR曲面
  4. 请注意,如果我从

    更改上一行
    device->SetTexture(0, brightpass_texture);
    

    device->SetTexture(0, scene_texture);
    

    然后一切正常。请注意,我尝试跳过brightpass着色器并简单地传递像素,但这也不起作用。

3 个答案:

答案 0 :(得分:2)

问题是多重采样。在D3DPRESENT_PARAMS结构中,我启用了多重采样。在启用多重采样时,无法使用“全屏四元组”技术从一个浮点纹理渲染到另一个浮点纹理。

相反,我在HDR场景渲染目标(scene_texture)中启用了多重采样,并在PRESENT_PARAMS结构中禁用了它。这很好,因为我只需要对场景渲染进行多重采样。

答案 1 :(得分:1)

您是否确定使用渲染到纹理标志创建了brightpass_texture?

答案 2 :(得分:0)

调试运行时是否会出现任何错误?你怎么得到ldr_surface?

如果您将场景直接渲染到ldr_surface并绕过所有HDR内容会发生什么?事情可能看起来有点饱和,但它应该给你一个想法...