在OpenGL中,有时在进行多次渲染和后期处理时,我需要将纹素应用于原始的装配片段,这是全屏纹理合成的一部分。通常情况是当前的传递来自FBO纹理到在上一次传递过程中,屏幕四边形已被渲染。要实现这一点,我在屏幕空间中计算对象的UV坐标。在GLSL中,我计算如下:
vec2 texelSize = 1.0 / vec2(textureSize(TEXTURE, 0));
vec2 screenTexCoords = gl_FragCoord.xy * texelSize;
现在我正在尝试使用CG / HLSL的Unity3D。这些语言的文档很差。如何计算CG / HLSL中的屏幕uv坐标?
答案 0 :(得分:3)
要计算屏幕texcoords,您通常会将屏幕分辨率或其倒数(res
或rcpres
)传递到着色器,然后使用全屏四边形中的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可能已经这样做了)。