Directx 计算CG/HLSL中的屏幕纹理坐标

Directx 计算CG/HLSL中的屏幕纹理坐标,directx,shader,direct3d,hlsl,Directx,Shader,Direct3d,Hlsl,在OpenGL中,有时,在进行多遍渲染和后处理时,我需要将纹理应用于原语的装配片段,这些片段是全屏纹理合成的一部分。当当前遍来自FBO纹理时,通常会出现这种情况,在上一遍中,屏幕四元体已渲染到FBO纹理。为此,我计算UV对象屏幕空间中的坐标。在GLSL中,我计算如下: vec2 texelSize = 1.0 / vec2(textureSize(TEXTURE, 0)); vec2 screenTexCoords = gl_FragCoord.xy * texelSize; 现在

在OpenGL中,有时,在进行多遍渲染和后处理时,我需要将纹理应用于原语的装配片段,这些片段是全屏纹理合成的一部分。当当前遍来自FBO纹理时,通常会出现这种情况,在上一遍中,屏幕四元体已渲染到FBO纹理。为此,我计算UV对象屏幕空间中的坐标。在GLSL中,我计算如下:

     vec2 texelSize = 1.0 / vec2(textureSize(TEXTURE, 0));
 vec2 screenTexCoords = gl_FragCoord.xy * texelSize;

现在我正在试验使用/HLSL的Unity3D。这些语言的文档很差。如何计算CG/HLSL中的屏幕uv坐标?

要计算屏幕纹理坐标,通常需要将屏幕分辨率或其倒数(
res
rcpres
)传递给着色器,然后使用全屏四元组中的texcoords(假设范围为
[0,1]
),该范围由这些参数修改

编辑:注意,在许多情况下,您希望
res
rcpres
都可用
res
对于计算当前位置非常有用(您不想使用
rcpres
,因为它需要除法),但是
rcpres
可以在CPU上计算一次,并且对于移动单个texel非常有用(
(res*uv)+rcpres)
是从原点再移动一个texel)

比如:

float2 res; // contains the screen res, ie {640, 480}

void postEffect(in float2 uv : TEXCOORD, ...)
{
    float2 pos = uv * res; // pos now contains your current position
逻辑是来自fs四元组的坐标在texel
0,0
和texel
maxX,maxY
处分别为
0,0
1,1
,因此知道尺寸后,可以直接相乘


但是,您必须为每个效果提供
res
的值,这取决于您的着色器系统(Unity3D可能已经这样做了)。

您检查过了吗?它们明显比GLSL更全面,有各种非常有趣的相关文章。是的,我知道,但是像这样做smth,如果我调整窗口大小,我会缩放图形(后期处理内容)。在OpenGL中,当使用gl_FragCoord.xy时,不会发生这种情况。如果窗口大小发生变化,您需要更新传递给着色器的变量。HLSL和Cg不像GLSL那样依赖魔法变量。我会更新这些变量。当重新调整帧大小时,我会将新的屏幕大小传递到着色器中。