안녕하세요. OpenGL ES 1.0으로 게임을 개발하고 있는 개발자 입니다.(2일차..ㅠㅠ)
배경 Texture를 로드해서 화면에 그려준 후에
객체를 그 위에 그렸을때, 배경 위에 그려진 객체가 반투명(?)하게 그려지고 있습니다.
배경을 그리지 않고 객체만 그리는 경우에는 정상적으로 보이던 객체가
배경을 그리고 그 위에 그리는 경우 반투명하게 보여집니다.
도움부탁드려요...T.T;
[소스]
public void onSurfaceCreated(GL10 gl, EGLConfig config)
{
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glClearDepthf(1.0f);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE);
}
public void onSurfaceChanged(GL10 gl, int width, int height)
{
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(0f, 1f, 0f, 1f, -1f, 1f);
}
public void onDrawFrame(GL10 gl)
{
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
scrollBackground(gl);
moveObject(gl);
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE);
}
private void scrollBackground(GL10 gl)
{
if(null == m_GameBackground)
return;
if(Float.MAX_VALUE == m_fBgScroll1)
m_fBgScroll1 = 0;
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glPushMatrix();
gl.glScalef(1f, 1f, 1f);
gl.glTranslatef(0f, 0f, 0f);
gl.glMatrixMode(GL10.GL_TEXTURE);
gl.glLoadIdentity();
gl.glTranslatef(0.0f, -m_fBgScroll1, 0.0f); // Scrolling the texture
m_GameBackground.draw(gl);
gl.glPopMatrix();
m_fBgScroll1 += GameEngine.SCROLL_BACKGROUND;
gl.glLoadIdentity();
}
private void moveObject(GL10 gl)
{
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glPushMatrix();
gl.glTranslatef(0f, 0f, 0f);
gl.glMatrixMode(GL10.GL_TEXTURE);
gl.glLoadIdentity();
gl.glTranslatef(0f, 0f, 0f);
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
gl.glFrontFace(GL10.GL_CCW);
gl.glEnable(GL10.GL_CULL_FACE);
gl.glCullFace(GL10.GL_BACK);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertextBuffer);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_BYTE, indexBuffer);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glDisable(GL10.GL_CULL_FACE);
gl.glPopMatrix();
gl.glLoadIdentity();
}
alpha composition (흔히 알파 블렌딩이라고 하죠) 에 대해 알고 계셔야 이해가 가능합니다.
결론적으로, (one, one) 조합은 뒷그림(destination)과 앞그림(source)의 각 색상(RGB)을 더하라는 의미 입니다.
따라서 투명한 것처럼 보입니다.
반면, (one, 1-srcAlpha) 조합은 SourceOver라는 가장 기본적인 블렌딩 수식입니다. 앞의 것이 많이 보일 수록 뒤의 것이 안보이게 되지요. 셀로판지를 겹쳤을때와 불투명한 종이를 겹쳤을때 등의 모든 경우를 모두 다 잘 표현하지요.
자세한 것은 Poter-duff의 논문을 보시거나, 블렌딩으로 검색해보세요.
자답이군요..
객체 이미지에 알파값이 있었던 모양(?) 입니다.
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE); 에서
gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA); 로 변경했더니
잘 나오는데...아직 정확한 이유는 잘 모르겠습니다..ㅠㅠ
좀더 파봐야겠네요...