화면에 5 개의 다른 텍스처를 그려보고 있지만 알파 작업을 할 수없는 것처럼 보입니다. 알파가 없으면 텍스처가 잘 렌더링되지만,있을 때 정말 이상한 "효과"가 있습니다.Android OpenGL에서 불투명도가있는 텍스처를 올바르게 그리는 방법은 무엇입니까?
이 좋아, 우선 내가 (주어진 순서대로) 불투명도 내 텍스처의 모든 5 draw
전화 : 0.5
, 1.0
, 0.5
, 1.0
, 0.5
을. 하지만 앱을 시작하면 실제로 오프셋이 1과 비슷하므로 1.0
, 0.5
, 1.0
, 0.5
, 1.0
개가 있습니다. 이상한 것은 아닙니다. 내 앱이 시작된 후 약 1 초가 지나면 첫 번째 텍스처는 0.5
의 불투명도를 가지며 심지어 더 이상한 것은 두 번째 draw
메소드에서 발생하지 않지만 어쨌든 draw
의 첫 번째 호출과 두 번째 호출 사이에 발생합니다. 이것도 어떻게 가능합니까?
이 최종 결과 (그것은 0.5
, 1.0
, 0.5
, 1.0
, 0.5
해야하지만, 당신이 볼 수는 근처에도 아니다) : 일부 코드에 대한 지금
(내가 ' 일부 관련성없는 부분은 건너 뜁니다.)
public void onSurfaceChanged(GL10 gl, int width, int height)
{
// Here I pass width & height to my texture objects for future reference (code skipped)
gl.glViewport(0, 0, width, height);
gl.glOrthof(0, width, height, 0, 0, 1);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
}
그리기 : 텍스처 개체의
public void onDrawFrame(GL10 gl)
{
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
// Here I call draw of each texture object
}
그리기 방법 :
public void draw(GL10 gl)
{
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
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, vertexBuffer);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length/3);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_MODULATE);
gl.glColor4f(1.0f, 1.0f, 1.0f, this.alpha); // This is where the magic doesn't happen (:
}
표면을 업데이트
public void onSurfaceCreated(GL10 gl, EGLConfig config)
{
// Textures are being loaded in here, which is just fine (code skipped)
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
gl.glClearDepthf(1.0f);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
}
:
표면을 만들기
버텍스/텍스처 버퍼를 생성하고 텍스처를로드하는 부분을 건너 뛰었습니다. 그 부분은 tutorial이고 잘 작동하는 것 같습니다.
그래서 .. 내가 뭘 놓치고 있다고 생각하니? 이 이상한 문제의 원인은 무엇일까요?
내가 추측해야 할 것이 있다면, 나는 이상한 하드 코어 OpenGL 문제/버그 또는 그 이상의 인상을 잊어 버린 깃발과 같은 것이라고 말하고 싶습니다. 그것은 드로잉의 순서 또는 그와 비슷한 것이 될 수 없습니다, 나는 그것을 모두 두 번 체크했습니다. 또한 각각의 텍스처에 대해 불투명도로 설정하려고 시도했는데 완벽하게 작동합니다. 텍스처의 불투명도가 서로 다를 때만 문제가 발생합니다. 이상하게도 그 사이의 깜박임은 사용자 코드에 의해 생길 수 있다고 생각하지 않습니다. OpenGL의 이상한 점이 될 것입니다. GLWallpaperService