它不会从它的大小变得更大。这是关于纹理的一个常见误解。纹理只是一种花哨的查找表。纹理相对于彼此并没有“缩放”;这只是使用什么纹理坐标的问题。很可能,您正在使用与屏幕纹理相同的纹理坐标作为普通贴图。由于我们可能正在谈论归一化的纹理坐标,这意味着您将相同的[0,1]范围映射到两者之间。要获得您所说的效果,您需要计算用于普通纹理的纹理坐标,以实现所需的效果。因此,如果您有一个相对于屏幕纹理的纹理坐标,您必须将其转换为普通纹理中想要的空间。有几种方法可以做到这一点。手动方法是在CPU上计算纹理之间的大小比率,然后将其传递给着色器。使用您提供的数字,大小比率将为:
(1152.0/256.0, 864.0/256.0) = (4.5, 3.375).
请确保使用浮点数进行计算。完成后,只需在着色器中将此比率传递给uniform,并在采样之前将纹理坐标乘以该比率:
uniform vec2 textureRatio;
void main() {
vec4 screenTexColor = texture(screenTex, texCoord);
vec2 normTexCoord = textureRatio * texCoord;
vec4 normalValue = texture(normalTex, normTexCoord);
}
在GLSL中的自动方式是直接在着色器中完成。这需要GLSL 1.30或更高版本。基本上,你可以使用语言的可用特性来计算比率:
void main() {
vec2 textureRatio = textureSize(screenTex) / textureSize(normalTex);
vec4 screenTexColor = texture(screenTex, texCoord);
vec2 normTexCoord = textureRatio * texCoord;
vec4 normalValue = texture(normalTex, normTexCoord);
}
在这两种情况下,我假设您的GL_TEXTURE_WRAP_S/T设置为GL_REPEAT,并具有适当的纹理或采样器参数。
请注意,在CPU上计算比率并将其作为统一变量传递,很可能比在着色器中计算要快。特别是对于将大量运行的片段着色器。