HLSL 如何在着色器之间传递数据/读取现有颜色值?
我有 2 个 HLSL ps2.0 着色器。简单来说,它们是:
Shader 1
- 读取纹理,
- 根据该纹理输出颜色值
Shader 2
- 问题:需要从 Shader 1 读取颜色
- 输出最终颜色,它是一个函数输入颜色的
(它们需要是不同的着色器,因为我已经达到 1 个着色器的最大顶点着色器输出)
我的问题是我无法弄清楚着色器 2 如何访问现有的片段/像素颜色。
知道如何使用 HLSL 执行这些操作可以解决我的问题;
- 读取现有的像素颜色(我认为这是不可能的)
- 将着色器 1 的结果作为 float4 传递给着色器 2
- 将着色器 1 的渲染结果作为内存中的纹理,并让着色器 2 读取该结果
I have 2 HLSL ps2.0 shaders. Simplified, they are:
Shader 1
- Reads texture
- Outputs colour value based on this texture
Shader 2
- Problem: Need to read in the colour from Shader 1
- Outputs the final colour which is a function of the input colour
(They need to be different shaders as I've reached the maximum vertex-shader outputs for 1 shader)
My problem is I cannot work out how Shader 2 can access the existing fragment/pixel colour.
Knowing how to do any of these things with HLSL would solve my problem;
- Read existing pixel colour (I don't think this is possible)
- Pass result of Shader 1 to Shader 2 as a float4
- Render result of Shader 1 as a texture in memory, and have Shader 2 read that in
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
选项 3:
您的 HLSL 代码将很简单,第二个着色器将仅从texture2D 中采样并进行计算。
您需要使用第一个着色器绘制渲染目标,然后您可以将渲染目标绑定到纹理,并从第二个着色器访问它,就像它是任何其他texture2D一样。请注意,您无法读取当前设置的渲染目标,因此请在第二遍之前设置回帧缓冲区。
另外,请解释一下您是如何设法达到顶点着色器输出的限制的?我很好奇:P。
Option 3:
Your HLSL code will be simple, the second shader will just sample from a texture2D and und that for it's calculations.
You will need to draw to a render target with your first shader, then you can bind your render target to a texture, and access it from the second shader as if it were any other texture2D. Note that you can't read from a render target that is currently set, so set back to the framebuffer before your second pass.
Also, care to explain how you've managed to reach the limit on vertex shader outputs? I'm curious :P.
要执行您想要的操作,您可以在执行着色器 1 和着色器 2 之间切换渲染目标。
您将第一个着色器输出到纹理,然后将此纹理传递到第二个着色器。
这是在 Ogre 中使用 合成器脚本 和目标完成的。
To do what you want, you can switch render targets between execution of shader1 and shader2.
You output your first shader to a texture and then you pass this texture to your second shader.
This is done in Ogre with Compositor scripts and target.
合成器脚本似乎仅适用于全屏(或更准确地说,全视口)效果。
渲染到纹理是必经之路。它不一定是通过合成器脚本来完成的。
我的这个帖子 Ogre 论坛有更详细的内容;
Compositor scripts seem to be only for fullscreen (or more accurately, full viewport) effects.
Render-to-texture is the way to go. It's not necessarily accomplished with compositor scripts.
This thread of mine on the Ogre forums goes into more detail;