У меня есть две текстуры и «коэффициент наложения», и я хотел бы смешать их, модулируя текущий цвет; по сути, я хочу использовать следующий шейдер:
gl_FragColor = gl_Color * mix(tex0, tex1, blendFactor);
Я использую OpenGL ES 1.1 для всех версий iPhone, поэтому я не могу использовать шейдеры, и у меня есть два текстурных блока.
Моя лучшая попытка:
// texture 0
glActiveTexture(GL_TEXTURE0);
image1.Bind();
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
// texture 1
glActiveTexture(GL_TEXTURE1);
image2.Bind();
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC2_RGB, GL_CONSTANT);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_INTERPOLATE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC2_ALPHA, GL_CONSTANT);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, GL_SRC_ALPHA);
const float factor[] = { 0, 0, 0, blendFactor };
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, factor);
Это дает эффект шейдера:
gl_FragColor = mix(gl_Color * tex0, tex1, blendFactor);
но я не вижу, как модулировать текстуру 1 по цвету. Есть ли способ, чтобы цвет, предоставляемый текстурным блоком, автоматически модулировался входящим основным цветом?
Или любым другим способом сделать то, что я хочу, что мне не хватает? Несколько проходов определенно разрешены, но они должны иметь правильный эффект смешивания; У меня
glBlend(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
включен, поэтому может быть сложно получить правильные результаты с несколькими проходами.