Как модулировать каждый текстурный блок в OpenGL ES 1.1? - PullRequest
2 голосов
/ 17 апреля 2010

У меня есть две текстуры и «коэффициент наложения», и я хотел бы смешать их, модулируя текущий цвет; по сути, я хочу использовать следующий шейдер:

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

включен, поэтому может быть сложно получить правильные результаты с несколькими проходами.

...