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