2014-04-09 4 views
0

화면에 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해야하지만, 당신이 볼 수는 근처에도 아니다) : 일부 코드에 대한 지금

enter image description here (내가 ' 일부 관련성없는 부분은 건너 뜁니다.)

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

답변

1

왜 마법 추첨 전에하지 일어나는 장소 :

내가 살아있는 벽지로이 GL 마법의 모든 팩을 제 3 자 라이브러리를 사용하고 있음을 지적해야한다,이 멋진 LIB의 요구? 기본 색상 값은 (1,1,1,1)이므로 처음에는 1.0에서 알파로 시작한 다음 텍스처를 그리고 0.5로 알파를 설정하고이 값으로 아직 두 번째 텍스처를 그립니다 ... Ergo 이상한 오프셋 효과.

마지막 텍스처가 그려지면 1.0의 알파 값을 가지 고 나서 설정합니다.5는 다음 새로 고침에서 첫 번째 텍스처를 그리는 데 사용됩니다. 알파가 1.0에서 0.5로 변경되었으므로 가장 위에있는 요소가 깜박입니다. 결국 당신이 게시 한 이미지에 보이는 결과를 분명하게 얻게됩니다.

gl.glColor4f(1.0f, 1.0f, 1.0f, this.alpha); // This is where the magic doesn't happen 

그래서 라인을 제거하려고 이런 식으로 시도 :

gl.glColor4f(1.0f, 1.0f, 1.0f, this.alpha); // This is where the magic does happen 
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length/3); 
gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // Low mana, stop the magic 
마법이 일어나는 곳

그래서이 진정으로

관련 문제