Я написал это простое затенение для наложения текстуры поверх других (базовые) текстур -Как наложить текстуру поверх другой, не обрезая базовую текстуру?
varying highp vec2 textureCoordinate;
varying highp vec2 textureCoordinate2;
uniform sampler2D inputImageTexture;
uniform sampler2D inputImageTexture2;
void main()
{
mediump vec4 base = texture2D(inputImageTexture, textureCoordinate);
mediump vec4 overlay = texture2D(inputImageTexture2, textureCoordinate2);
mediump float ra = (overlay.a) * overlay.r + (1.0 - overlay.a) * base.r;
mediump float ga = (overlay.a) * overlay.g + (1.0 - overlay.a) * base.g;
mediump float ba = (overlay.a) * overlay.b + (1.0 - overlay.a) * base.b;
gl_FragColor = vec4(ra, ga, ba, 1.0);
}
выпуска - Это работает для одного вопроса, за исключением. Если оверлейное изображение меньше основного изображения, внешняя область изображения наложения дает альфа-значение 1,0, то есть overlay.a == 1.0
. Из-за этого базовое изображение обрезается оверлейным изображением. Область вне наложения выглядит черной.
Я новичок в opengl, и ожидал, что за его пределами альфа-текстура должна выглядеть как 0.0? Как я могу исправить свой шейдерный код для достижения желаемого поведения? Или мне нужно изменить мой графический конвейер?
EDIT Vertex шейдеров ценам ниже
attribute vec4 inputTextureCoordinate2;
varying vec2 textureCoordinate;
varying vec2 textureCoordinate2;
void main()
{
gl_Position = pos;
textureCoordinate = uv;
textureCoordinate2 = inputTextureCoordinate2.xy;
}
Не могли бы вы также добавить свой вершинный шейдерный код? – Swifter
@Swifter: добавлен вершинный шейдер –