【问题标题】:HLSL water refraction shaderHLSL 水折射着色器
【发布时间】:2025-08-01 15:20:01
【问题描述】:

我目前正在使用 XNA (DirectX9) 进行水渲染项目,我花了很多时间解决一个我不理解的问题。

在我的项目中,我渲染了代表水的地形和水平面。我目前正在尝试创建将应用于此平面的折射纹理。为此,我使用了一个渲染目标,在该目标中我渲染了水面下的地形部分(在像素着色器操作期间,将 => 剪辑到我的 HLSL 文件中)。我将此渲染目标转换为直接应用于水面的纹理。

我想要的结果和不画水位面完全一样,我只想看看水下的地形(暂时没有光束偏差)。但是现在,我有一个非常奇怪的结果。我录制了一些视频给你看,比任何解释都好:http://www.youtube.com/watch?v=XGesGvEnAEg

这里是折射的HLSL文件的代码:https://gist.github.com/Noxalus/8213296

你知道问题出在哪里吗?

提前感谢您的帮助!

【问题讨论】:

    标签: shader hlsl


    【解决方案1】:

    可能是错的,但在我看来它只渲染一次然后重复使用? (当你用蓝色的水位面四处移动时看起来会发生变化,而不是刷新)?

    您确定每帧都在更新传递给折射着色器的纹理吗?

    【讨论】:

    • 感谢您的快速回答罗南。我确定我每帧都会更新折射纹理,因为我在 XNA 的 Draw 方法中调用了这个函数:gist.github.com/Noxalus/8213607 事实上,我尝试使用 Pix 调试我的 HLSL 文件,我可以看到折射纹理是什么:dl.dropboxusercontent.com/u/63123790/screenshots/Projet%203D/…它与我想要的相对应,如果此纹理将直接应用于屏幕空间,它将起作用,但事实并非如此。我将它应用在平面上,这就是它对我不起作用的原因。但我不知道如何解决这个问题:(