2014-02-24 6 views
1

OpenGL ES 2.0에서 쉐이더 효과를 겹칠 수 있습니까? (FBO 사용 안 함)OpenGL ES 2.0에서 쉐이더 효과가 중복 됨

glReadPixels을 수행 할 필요없이 다른 셰이더와 함께 셰이더 결과를 사용하고 처리 된 픽셀을 다시 밀어 넣는 방법?

// Push RGBA pixels into the GPU 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, Pixels_To_Render); 

// Apply first shader effect 
glUseProgram(FIRST_SHADER_HANDLE); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

// Apply the second shader effect sampling from the result of the first shader effect 
glUseProgram(SECOND_SHADER_HANDLE); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

// Get the overall result 
glReadPixels(......) 
+0

텍스처 기반 FBO를 피하기 원하는 이유가 있습니까? 그것들은 GPU에서 한 번의 렌더링 패스를 실행하고 그 결과 텍스처를 다음 번에 가져옴으로써 전체적으로 이것을 수행하는 상대적으로 간단한 방법을 제공합니다. 거의 모든 OpenGL ES 2.0 장치에서 작동합니다. –

답변

1

을 당신이 조각 셰이더와 픽셀 처리에 대해 얘기하고 가정 :

다음 의사 코드

내가 달성하기 위해 노력하고있어인가?

OpenGL ES 2.0 코어 API를 사용하면 대상 프레임 버퍼에서 픽셀을 GPU에서 다시 읽지 않고 프래그먼트 셰이더로 가져올 수 없습니다.

하지만 Shader 프레임 버퍼 가져 오기 확장 (일부 장소의 경우 iOS에서는 EXT_shader_framebuffer_fetch, NV_shader_framebuffer_fetch)을 지원하는 기기/플랫폼을 사용중인 경우 운이 좋았습니다. 이 확장을 통해 프래그먼트 셰이더는 대상 프레임 버퍼에서 렌더링 할 프래그먼트 (그리고 그 프래그먼트 만)에 대한 프래그먼트 데이터를 읽을 수 있습니다. 이것은 glReadPixels 작업의 성능 저하를 초래할 필요가 없으므로 프로그래밍 가능 블렌딩 또는 픽셀 후 처리 효과에 유용합니다.

확장자가 #extension GL_EXT_shader_framebuffer_fetch : require 인 것으로 선언 한 다음 gl_LastFragData[0] 내장 데이터의 조각 데이터를 읽습니다. (아래 첨자는 렌더링 타겟 인덱스를위한 것이지만, OpenGL ES 3.0을 사용하지 않는 한 복수의 렌더 타겟을 가지지 않으므로 항상 0입니다.) 평소와 같이 원하는대로 처리하고 gl_FragColor 또는 gl_FragData에 쓰십시오.

관련 문제