【问题标题】:How to correctly draw other texture in fragment shader?如何在片段着色器中正确绘制其他纹理?
【发布时间】:2021-01-09 09:33:16
【问题描述】:

如何正确计算我的 sampler2D 制服的 uv 坐标?

例如我有一个分辨率为 1920x1080 的主纹理,我在这个纹理上附加了一个着色器,然后将其他纹理作为具有 200x200 分辨率的 sampler2D 均匀传递。

另外,据我所知,我必须传递给着色器纹理分辨率及其标准化位置。但我不明白如何计算第二个纹理的 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;
}

【问题讨论】:

  • 取决于您希望如何定位纹理。也许画一张图,让问题更容易理解?

标签: opengl glsl shader


【解决方案1】:

您需要根据纹理大小的比例来缩放纹理坐标。如果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); 

【讨论】:

    【解决方案2】:

    你可以这样做

    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);
    }
    

    【讨论】:

      猜你喜欢
      • 2013-09-17
      • 1970-01-01
      • 2015-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多