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

时间:2013-01-07 21:30:04

标签: directx shader direct3d hlsl

在OpenGL中,有时在进行多次渲染和后期处理时,我需要将纹素应用于原始的装配片段,这是全屏纹理合成的一部分。通常情况是当前的传递来自FBO纹理到在上一次传递过程中,屏幕四边形已被渲染。要实现这一点,我在屏幕空间中计算对象的UV坐标。在GLSL中,我计算如下:

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

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

1 个答案:

答案 0 :(得分:3)

要计算屏幕texcoords,您通常会将屏幕分辨率或其倒数(resrcpres)传递到着色器,然后使用全屏四边形中的texcoords(假设范围为{{1}由那些修改。

修改:请注意,在许多情况下,您希望[0,1]res都可用。 rcpres对于计算当前位置非常有用(您不希望使用res,因为它需要除法),但rcpres可以在CPU上计算一次对于通过单个纹素移动非常有用(rcpres是来自原点的另一个纹素)。

类似的东西:

(res * uv) + rcpres)

逻辑是来自fs quad的坐标是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 0,0和texel 0,0 1,1,所以知道尺寸,你可以倍增

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