0

使用directx 11,我正在开发一个图形效果系统,该系统使用几何着色器在世界空间中构建四边形。然后这些四边形使用片段着色器,其中主要纹理是渲染的场景纹理。有效地在 qorld 空间四边形上产生后期处理效果。其中最简单的是色调效果。

顶点着色器仅将数据传递给几何着色器。

几何着色器根据法线计算额外的顶点。使用叉积,我找到 x 和 z 轴,并在原始位置的每个对角线方向上附加 4 个新顶点的三流(从给定的位置和大小生成四边形)。

像素着色器(色调效果)只是将场景纹理颜色与颜色变量集相乘。

四边形生成并正确显示在屏幕上。然而;

我面临的问题是 uv 坐标的映射无法与后台缓冲区上的图像对齐。也就是说,当使用半 alpha 作为给定颜色的 tint shader 时,您可以看到显示在四边形上的图像不会完美地覆盖后台缓冲区上的图像,除非四边形面向相机。四边形法线与相机 y 轴越接近,图像越偏斜。

我目前正在使用下面的公式来计算 uv 坐标:

    float2 uv = vert0.position.xy / vert0.position.w;
    vert0.uv.x =  uv.x * 0.5f + 0.5f;
    vert0.uv.y = -uv.y * 0.5f + 0.5f;

我还使用了下面的公式,这导致(IMO)在 uv 中没有考虑到考虑因素。

    float2 uv = vert0.position.xy / SourceTextureResolution;
    vert0.uv.x =  uv.x * ASPECT_RATIO + 0.5f;
    vert0.uv.y = -uv.y + 0.5f;

问题: 如何根据几何着色器中生成的顶点位置获取屏幕空间 uv 坐标?

如果您想让我详细说明任何要点,请询问,我会尽力而为:)

提前致谢。

4

0 回答 0