Как правильно нарисовать другую текстуру во фрагментном шейдере?

#opengl #glsl #shader

#opengl #glsl #шейдер

Вопрос:

Как правильно рассчитать uv-координаты для моей формы sampler2D?

Например, у меня есть основная текстура с разрешением 1920×1080, я прикрепил шейдер к этой текстуре, а затем передал другую текстуру как sampler2D uniform с разрешением 200×200.

Также, как я понимаю, я должен перейти к разрешению текстуры шейдера и ее нормализованному положению. Но я не понимаю, как вычислить 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;
}
 

Комментарии:

1. Зависит от того, как вы хотите расположить текстуру. Может быть, нарисовать картинку, чтобы сделать вопрос более понятным?

Ответ №1:

Вам необходимо масштабировать координаты текстуры в соответствии с соотношением размеров текстуры. Если единица измерения u_render_texture_pos равна пикселям и поскольку координаты текстуры находятся в диапазоне [0.0, 1.0], смещение также должно быть масштабировано.
Пропустите полученный цвет u_render_texture , если одна из координат не находится в диапазоне [0.0, 1.0]:

 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 amp;amp; uv.x <= 1.0 amp;amp; uv.y >= 0.0 amp;amp; 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);
}