Я упростил свою задачу до рисования квадрата для иллюстрации. Я хочу нарисовать текстуру, которая изменяет альфа-канал от 0 до 255 и обратно до 0 по вертикали, чтобы она сливалась с фоном. Сейчас он затемняет фон, и я не могу понять почему. Это использует OpenGL ES на iOS 9.
Сначала я включаю смешивание, которое, как мне кажется, мне нужно:
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Затем заполняю буфер зеленым цветом:
glClearColor(0, 0.5, 0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
У меня есть это изображение, которое я использую в качестве текстуры:
И я рисую следующие вершины ({x, y, z}, {r, g, b, a}, {tx, ty}) с помощью GL_TRIANGLES:
{{0.4, 0.3, 0}, {1, 0, 0, 1}, {0, 0}},
{{0.6, 0.3, 0}, {1, 0, 0, 1}, {1, 0}},
{{0.4, 0.5, 0}, {1, 0, 0, 1}, {0, 1}},
{{0.6, 0.3, 0}, {1, 0, 0, 1}, {1, 0}},
{{0.4, 0.5, 0}, {1, 0, 0, 1}, {0, 1}},
{{0.6, 0.5, 0}, {1, 0, 0, 1}, {1, 1}},
Я ожидаю, что красный компонент вершин будет модулировать текстуру, так как это мой фрагментный шейдер:
varying lowp vec4 DestinationColor;
varying lowp vec2 TexCoordOut;
uniform sampler2D Texture;
void main(void) {
gl_FragColor = DestinationColor * texture2D(Texture, TexCoordOut);
}
Это так, но в результате получается не просто красный цвет на зеленом. По краям темнеет, я ожидал, что будет нарисован только зеленый цвет:
В ответе на аналогичный вопрос здесь говорится, что я должен использовать glTexEnv (GL_BLEND). Однако я думаю, что это API OpenGL ES 1.
Кто-нибудь знает, как я могу добиться желаемого смешивания? Я хочу, чтобы красный потускнел на зеленом. Верх и низ должны быть зелеными, а не более темными. Не должно быть явных горизонтальных краев.
РЕДАКТИРОВАТЬ: Я добавляю больше изображений, иллюстрирующих мою проблему. Вот две розовые точки в GIMP:
Когда я кладу один на другой (в GIMP), они прекрасно сочетаются. Также они красиво сочетаются с зеленым фоном:
Когда я воссоздаю это в OpenGL ES, я получаю затемнение, которое особенно заметно там, где накладываются розовые точки. На этот раз я сделал один очень узким, чтобы вы могли лучше увидеть эффект:
Я попробовал как glBlendFunc, так и glBlendFuncSeparate, что дало тот же эффект. Обратите внимание, что альфа фона равна 1.
source
- это входящее значение (то, которое вы накладываете), аdestination
- это значение, уже находящееся в буфере кадра: opengl.org/sdk/docs/man2/xhtml/glBlendFunc.xml - person Nicolas Miari   schedule 20.10.2015