당신이 요구하는 것은 OpenGL 3.2에서 가능합니다. FBO는 렌더 버퍼가 필요하지 않고 확산 색상을 색상 질감, 다른 색상 질감에 수직, 깊이 질감에 뱉어 내고 있습니다. 실제로 렌더 버퍼는 문제가되지 않습니다. 샘플링 할 수 없기 때문에 glReadPixels(...)
GPU 메모리에 모든 것을 유지하는 대신 RBO에서 CPU의 텍스처로 데이터 를 사용 하거나 다른 방식으로 복사해야합니다. 그래서...
실제로 원한다면 첫 번째 패스 쉐이더에 코드를 작성하여 깊이와 같은 것을 수동으로 FBO의 별도 색상 텍스처 첨부 파일로 출력 할 수 있습니다. 즉 사용할 수 있도록 할 것입니다 당신이 게시물 패스 쉐이더한다. 들어 는 OpenGL의 내부 깊이 테스트에 사용, 당신은 추가하거나 당신의 FBO의 GL_DEPTH_ATTACHMENT로 RBO 또는 질감 세트가 필요합니다. 하지만 둘 다 제공하기 위해 단일 텍스처를 설정할 수 있습니다 있습니다.보다 효율적이고 사용하기 쉽습니다.
내 깊이 텍스처 설정 코드는 다음과 같습니다 (자바, ByteBuffer를 무시하고 ...이 개념은 실제로 Java에 잘 맞지 않기 때문에 정수 핸들 / 포인터를 참조하기 위해 "id"를 사용합니다).
gBufferDepthTexture = new Texture();
gBufferDepthTexture.id = glGenTextures();
gBufferDepthTexture.unit = 2;
gBufferDepthTexture.width = Display.getWidth();
gBufferDepthTexture.height = Display.getHeight();
gBufferDepthTexture.bytes = ByteBuffer.allocateDirect(Display.getWidth()*Display.getHeight() * 4);
glActiveTexture(gBufferDepthTexture.unit + GL_TEXTURE0); //eg. 0 + 33984 = GL_TEXTURE0, while 31 + 33984 = GL_TEXTURE31.
glBindTexture(GL_TEXTURE_2D, gBufferDepthTexture.id);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, gBufferDepthTexture.width, gBufferDepthTexture.height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, gBufferDepthTexture.bytes);
//...GL_UNSIGNED_INT or GL_UNSIGNED_BYTE may work better for you, instead... YMMV.
//glPixelStorei(GL_PACK_ALIGNMENT, 4);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
그리고 나중에 :
glBindFrameBuffer(GL_DRAW_FRAMEBUFFER, fbo.id);
//your existing glFramebufferTexture2D(...) calls here
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, gBufferDepthTexture.id, 0);
이제 gBufferDepthTexture
두 번째, 세 번째 패스 프래그먼트 셰이더에 유니폼으로 전달할 수 있습니다 . 스텐실 버퍼로 정확히 똑같은 일을 할 수 있다고 가정 할 수 있다고 생각합니다.