gpt4 book ai didi

directx - 在像素着色器中设置纹理并使其成为渲染目标?

转载 作者:行者123 更新时间:2023-12-04 18:20:49 25 4
gpt4 key购买 nike

我想知道,如果我使用着色器渲染场景,并传入纹理,而纹理恰好也是该场景的渲染目标,是否会导致任何不需要的行为?

所以基本上:

texture t;

shader->SetTexture("texture",t);

device->SetRenderTarget( 0, t->surface );

shader->Begin("effect")
// do some more shader stuff

device->EndScene();

这到底会造成什么?

如果我在渲染前不清除渲染目标,纹理是否仍能正常工作?我只是假设在调用 device->End 之前最终更改不会写入纹理?

最佳答案

我假设您在谈论 DirectX9。文档没有说明这个具体案例,但我可以告诉你以下内容:

I just assume the final changes don't get written into the texture until device->End is called

这是一个错误的假设。想一想,您假设您绘制的所有三角形的所有像素都将存储在“某处”,并且执行所有纹理获取而不会将任何像素写回渲染目标。这需要任意数量的内存,因此是不可能的。

实践中:

  • 硬件通常会在三角形出现时对其进行处理,一次处理多个三角形
  • 它会在需要时更新帧缓冲区(在您的情况下是纹理内存支持),假设不存在竞争条件

所以,假设 DX9 没有报错(如果你真的想知道,试试吧,我不再做 DX9),它未定义。

也就是说,DirectX10 对此更加明确 (source):

If any subresources are also currently bound for reading or writing (perhaps in a different part of the pipeline), those bind points will be NULL'ed out to prevent the same subresource from being read and written simultaneously in a single rendering operation.

因此,在 DirectX10 中,您的纹理设置将被 API 删除。

关于directx - 在像素着色器中设置纹理并使其成为渲染目标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1620096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com