2013-03-03 3 views
3

Читаемый круг ближе к зрителю, а текстура имеет прозрачный фон.Режим смешивания OpenGL и буфер глубины

(Оба объекта представляют собой квадраты одинакового размера, только разные текстуры и х, z-координаты).

Я хочу:

enter image description here

Но у меня есть:

enter image description here

Я знаю, что я должен сделать что-то с режимами смешивания и, возможно, буфер глубины, но я не точно знаю, что. Кто-нибудь может мне помочь?

текущий код для загрузки текстуры:

public void initTexture(GL10 gl, Bitmap bitmap) { 
    gl.glEnable(GL10.GL_BLEND); 
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); 

    int[] texture = new int[1]; 
    gl.glGenTextures(1, texture, 0); 

    textureId = texture[0]; 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId); 

    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 

    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT); 

    GLUtils.texImage2D(GLES10.GL_TEXTURE_2D, 0, bitmap, 0); 
    bitmap.recycle(); 
} 

соответствующей части рисунка, для каждого из этих объектов:

gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId); 

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 

    gl.glFrontFace(GL10.GL_CW); 

    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, verticesBuffer); 
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); 

    gl.glDrawElements(GLES20.GL_TRIANGLES, indices.length, GLES10.GL_UNSIGNED_SHORT, indicesBuffer); 

Спасибо!

Примечание: Я использую OpenGL ES 1.

ответ

0

Я думаю, что вы должны изменить свою функцию смешивания:

попробовать:

gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_DST_ALPHA); 
+0

Ничего не изменил, кроме того, цвет обоих объектов теперь ярче (например, пастель). – Ixx

+0

ой, да, я думал о «glAlphaFunc», вы попробовали решение от Bartek? это кажется актуальным. – Guian

+0

Да, но это не полно, и мои первые попытки ничего не улучшили ... попробуем больше, когда у меня будет время. – Ixx

0

Вы должны отключить запись в буфер глубины:

glDepthMask(false); 

Затем сначала нарисуйте синий квадрат, а затем красный (который ближе к камере) над ним. После рисования прозрачной геометрии вы можете снова включить запись в буфер глубины с помощью glDepthMask(true).

В противном случае синий квадрат отбирается красным.

+0

Хм ... У меня несколько сложная сцена, но я просто рисую все квадрациклы слева направо ... мне нужно заботиться о порядке рисования? Извините, если вопрос глуп, но в OpenGL уже есть координация z, почему мне приходится организовывать порядок розыгрыша? Я просто хочу, чтобы прозрачные растровые изображения отображали все, что осталось ... – Ixx

1

Вы не хотите смешивать, потому что это будет смешивать цвета. Что вы хотите, это alphatesting. Используйте glEnable(GL_ALPHA_TEST) и glAlphaFunc, чтобы установить его соответствующим образом.

Смежные вопросы