2014-09-02 6 views
1

아무 것도 쓸 수있는 대화 형 2D 효과를 만들고 싶습니다. 따라서 대부분 투명한 효과를 취하여 텍스처로 렌더링하고 싶습니다. 사각형에 놓기 만하면됩니다.투명 배경이있는 텍스처로 OpenGL ES 2.0 렌더링

내가 만난 문제는 배경색을 없앨 수 없다는 것입니다. 효과를 대상 위에 올려 놓으면 효과의 배경색이 효과를 내고자하는 대상을 차단합니다.

여기 내 코드입니다. 아무도 내가 놓친 걸 말해 줄 수 있니?

그리기 :

GLES20.glClearColor(0.6f, 0.34f, 0.14f, 0.0f); 
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); 
GLES20.glDisable(GLES20.GL_DEPTH_TEST); 
GLES20.glEnable(GLES20.GL_BLEND); 
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA); 

ball.draw(); //This is the object a simple square draw with 2 triangles 
particleSystem.renderToTexture(); //effect rendering to texture and drawing it 

(가) 텍스처 코드 코드 렌더링은 :

public void renderToTexture(){ 
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fb[0]); 
    GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT); 
    GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, renderTex[0], 0); 
    GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, GLES20.GL_DEPTH_ATTACHMENT, GLES20.GL_RENDERBUFFER, depthRb[0]); 
    int status = GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER); 

    drawRender(); //draws the effect on a fbo and saving the texture to renderTex[0] 

    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); 
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, renderTex[0]); 
    drawEffect(); //draws a square with the effect texture on it 

문제는 여기 어딘가에해야하지만, 내가 무엇을 할 생각이 없다. 나는 내가 생각할 수있는 모든 것을 시도했다. 심지어 쉐이더에서 배경색을 처분하는 일은 제멋대로입니다.

+1

이 코드는 문제가없는 것으로 보입니다. 프레임 버퍼 부착물 (renderTex [0])으로 사용하는 텍스처의 형식은 무엇입니까? 알파 구성 요소가있는 형식을 사용해야합니다. 가능한 다른 문제는'renderToTexture()'에 사용 된 선명한 색상이거나'Drawing()'에 사용 된 프래그먼트 셰이더 일 수 있습니다. –

+0

@RetoKoradi thaaank youu. 나는 이것을 사용했다. GLES20.glTexImage2D (GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGB, texW, texH, 0, GLES20.GL_RGB, GLES20.GL_UNSIGNED_SHORT_5_6_5, null); Ofc 투명도가 전혀 표시되지 않았습니다. – FaNaT

답변

1

게시 된 코드는 완벽하게 잘 보입니다. 색상 렌더링 타겟 (renderTex[0])에 사용하는 텍스처가 알파 성분을 가지고 있는지 확인해야합니다.

컬러 렌더링이 보장되는 ES 2.0의 텍스처 형식 수는 매우 제한되어 있습니다. 알파 성분을 가진 유일한 두 개 (표 4.5 참조)는 GL_RGBA4GL_RGB5_A1입니다. 가장 중요한 점은 이 아닌은 구성 요소 당 8 비트의 GL_RGBA을 포함합니다.

그래서 모든 ES 2.0 구현에서 작동하는을 보장 알파 구성 요소와 컬러 렌더링 가능한 텍스처을 정의, 당신은 glTexImage2D()의 형식 인수에 대해 내부 형식에 대한 GL_RGBAGL_UNSIGNED_SHORT_4_4_4_4 또는 GL_UNSIGNED_SHORT_5_5_5_1을 사용해야합니다.

가장 일반적인 장치 (적어도 내가 본 모든 장치)는 OES_rgb8_rgba8 확장을 지원하며 8 비트 구성 요소 텍스처에 렌더링을 지원합니다. 그러나 완전히 이식성을 원한다면 이러한 형식의 렌더 대상을 사용하기 전에이 확장이 있는지 확인해야합니다.

+0

GL_RGBA와 함께 슬프지만 제 효과가 거의 보이지 않습니다. RGB와 GL_UNSIGNED_SHORT_5_6_5를 사용하면 꽤 효과적이며 다른 두 가지를 사용하면 검정색 화면을 다시 표시합니다. – FaNaT

+0

존재 여부 확인 방법 OES_rgb8_rgba8? – David

0

나는이 질문이 오래되었다는 것을 알고있다. 그러나 나는 지금도 그것을 발견했고, 나를위한 해결책은 GLSurfaceView로 무엇인가를하는 것이었다. 다만 이미 GL_RGBA 형식을 사용하고 아무 것도 작동되지 않았 음을 정말 짜증이었다

glSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 0, 0); 
glSurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT); 

컨텍스트를 설정 한 후 다음 줄을 추가하지만,이 마법처럼 일했다.