Android Получение правильной непрозрачности / цветов с помощью смешения glBlendFunc в OpenGL-ES - PullRequest
0 голосов
/ 01 февраля 2011

В моей программе я хочу нарисовать квадрат (с различной непрозрачностью, скажем, красный для аргументов) на текстурированном фоне.Однако в зависимости от фона квадрат имеет неправильный цвет.При альфа = 1.0f (непрозрачный) квадрат должен выглядеть красным, что он делает на черном фоне, но на белом фоне он выглядит белым (и соответственно масштабируется между)

В моей GLActivity установлены следующиеФлаги:

gl.glDisable(GL10.GL_LIGHTING);
gl.glDisable(GL10.GL_CULL_FACE);
gl.glDisable(GL10.GL_DEPTH_BUFFER_BIT);
gl.glDisable(GL10.GL_DEPTH_TEST);
gl.glEnable(GL10.GL_DITHER);
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE);

Затем я рисую текстуру фона:

gl.glClearColor(0.0f,0.0f,0.0f,1.0f);


gl.glBindTexture(GL10.GL_TEXTURE_2D, texturesFPS[1]);
 gl.glEnable(GL10.GL_TEXTURE_2D);

 gl.glPushMatrix();
 gl.glTranslatef(imageOffSetX, 0, 0);
 gl.glColor4f(1,1,1,1);
 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
 gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

 gl.glVertexPointer(3, GL10.GL_FLOAT, 0,vertexBGBuffer);
 gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBGBuffer);
 gl.glDrawElements(GL10.GL_TRIANGLES, indices.length,GL10.GL_UNSIGNED_SHORT, indexBuffer);

 gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
 gl.glDisable(GL10.GL_TEXTURE_2D);

Затем я рисую квадрат на фоновое изображение:

 gl.glPushMatrix();
 gl.glTranslatef(x, y, 0);
 gl.glColor4f(color[0], color[1], color[2], 1.0f); // Set to 1.0f temporarily
 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
 gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
 gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_SHORT, indexBuffer);
 gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
 gl.glPopMatrix();

Я пробовалразные значения в glBlendFunc, но не могу понять, как добиться того, что я хочу.Любая помощь очень ценится:)

Ответы [ 2 ]

3 голосов
/ 01 февраля 2011

Мой ответ может развиваться, но я точно знаю, что вы должны использовать следующую смешанную функцию ...

gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
2 голосов
/ 01 февраля 2011

Я только что нашел решение, для правильной прорисовки фоновой текстуры мне было нужно:

   gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE);  

Затем, перед тем как нарисовать квадрат, мне нужно было вызвать это:

   gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...