如何在片段着色器中正确绘制其他纹理?
How to correctly draw other texture in fragment shader?
如何正确计算 sampler2D uniform 的 uv 坐标?
例如我有一个分辨率为 1920x1080 的主纹理,我将一个着色器附加到该纹理,然后将其他纹理作为分辨率为 200x200 的 sampler2D uniform 传递。
此外,据我了解,我必须传递给着色器纹理分辨率及其标准化位置。但是我不明白如何计算第二个纹理的uv坐标。
uniform sampler2D u_render_texture;
uniform vec2 u_render_texture_pos;
uniform vec2 u_render_texture_size;
主要内容:
void main() {
vec4 mainTextureCol = texture2D(u_texture, v_texCoord);
vec4 renderTextureCol = texture2D(u_render_texture, what is here?);
gl_FragColor = mainTextureCol + renderTextureCol;
}
您需要根据纹理大小的比例缩放纹理坐标。如果u_render_texture_pos
的单位是像素,由于纹理坐标在[0.0, 1.0]范围内,所以偏移量也要缩放。
如果其中一个坐标不在 [0.0, 1.0]:
范围内,则跳过从 u_render_texture
获得的颜色
uniform vec2 u_render_texture_pos;
uniform vec2 u_render_texture_size;
uniform vec2 u_texture_size;
void main()
{
vec2 uv = v_texCoord * u_render_texture_size/u_texture_size
+ u_render_texture_pos/u_texture_size;
vec4 mainTextureCol = texture2D(u_texture, v_texCoord);
vec4 renderTextureCol = texture2D(u_render_texture, uv);
vec4 finalColor = mainTextureCol;
if (uv.x >= 0.0 && uv.x <= 1.0 && uv.y >= 0.0 && uv.y <= 1.0)
finalColor += renderTextureCol;
gl_FragColor = finalColor;
}
如果您使用的是 GLSL 1.30 或更高版本,您可以使用 textureSize
来确定纹理的大小:
vec2 texture_size = textureSize(u_texture, 0);
或
你可以做到
mat2 scale(vec2 scale) {
return mat2(scale.x, 0.0,
0.0, scale.y);
}
void main() {
vec2 scl = u_texture_size / u_render_texture_size;
vec2 uv = (v_texCoord - vec2(0.5)) * scale(scl) + vec2(0.5);
gl_FragColor = texture2D(u_texture, v_texCoord) + texture2D(u_render_texture, uv + u_render_texture_pos * scl);
}
如何正确计算 sampler2D uniform 的 uv 坐标?
例如我有一个分辨率为 1920x1080 的主纹理,我将一个着色器附加到该纹理,然后将其他纹理作为分辨率为 200x200 的 sampler2D uniform 传递。
此外,据我了解,我必须传递给着色器纹理分辨率及其标准化位置。但是我不明白如何计算第二个纹理的uv坐标。
uniform sampler2D u_render_texture;
uniform vec2 u_render_texture_pos;
uniform vec2 u_render_texture_size;
主要内容:
void main() {
vec4 mainTextureCol = texture2D(u_texture, v_texCoord);
vec4 renderTextureCol = texture2D(u_render_texture, what is here?);
gl_FragColor = mainTextureCol + renderTextureCol;
}
您需要根据纹理大小的比例缩放纹理坐标。如果u_render_texture_pos
的单位是像素,由于纹理坐标在[0.0, 1.0]范围内,所以偏移量也要缩放。
如果其中一个坐标不在 [0.0, 1.0]:
u_render_texture
获得的颜色
uniform vec2 u_render_texture_pos;
uniform vec2 u_render_texture_size;
uniform vec2 u_texture_size;
void main()
{
vec2 uv = v_texCoord * u_render_texture_size/u_texture_size
+ u_render_texture_pos/u_texture_size;
vec4 mainTextureCol = texture2D(u_texture, v_texCoord);
vec4 renderTextureCol = texture2D(u_render_texture, uv);
vec4 finalColor = mainTextureCol;
if (uv.x >= 0.0 && uv.x <= 1.0 && uv.y >= 0.0 && uv.y <= 1.0)
finalColor += renderTextureCol;
gl_FragColor = finalColor;
}
如果您使用的是 GLSL 1.30 或更高版本,您可以使用 textureSize
来确定纹理的大小:
vec2 texture_size = textureSize(u_texture, 0);
或
你可以做到
mat2 scale(vec2 scale) {
return mat2(scale.x, 0.0,
0.0, scale.y);
}
void main() {
vec2 scl = u_texture_size / u_render_texture_size;
vec2 uv = (v_texCoord - vec2(0.5)) * scale(scl) + vec2(0.5);
gl_FragColor = texture2D(u_texture, v_texCoord) + texture2D(u_render_texture, uv + u_render_texture_pos * scl);
}