2

在 OpenGL 中,有时在进行多通道渲染和后处理时,我需要将纹素应用于作为全屏纹理合成一部分的基元的组装片段。通常情况下,当前通道来自屏幕的 FBO 纹理quad 已在上一次渲染中渲染。为了实现这一点,我在 SCREEN SPACE 中计算对象 UV 坐标。在 GLSL 中,我这样计算:

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

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

4

1 回答 1

3

要计算屏幕 texcoords,您通常将屏幕分辨率或其倒数(res或)传递给着色器,然后使用由这些修改的rcpres全屏四边形(假设范围为 )中的 texcoords 。[0,1]

编辑:请注意,在许多情况下,您想要两者都res可用rcpresres对于计算当前位置很有用(你不想用rcpres它,因为它需要除法),但rcpres可以在 CPU 上计算一次,并且对于移动单个纹素很有用((res * uv) + rcpres)从原点多一个纹素)。

就像是:

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 四边形的坐标0,0位于 texel0,01,1texel maxX,maxY,因此知道尺寸,您可以相乘。

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

于 2013-01-07T22:17:12.177 回答