Những gì bạn đang hỏi là có thể có trong OpenGL 3.2. Tôi đã nhận được FBO của mình phun ra màu khuếch tán thành một kết cấu màu, quy tắc cho kết cấu màu khác và chiều sâu đến kết cấu chiều sâu - không cần kết xuất đồ họa. Trong thực tế, trình kết xuất chỉ là một vấn đề, vì bạn không thể lấy mẫu từ chúng, do đó bạn phải sử dụng glReadPixels(...)
hoặc bằng cách nào đó sao chép dữ liệu ra khỏi RBO và vào kết cấu trên CPU, thay vì chỉ duy trì mọi thứ trong bộ nhớ GPU. Vì thế...
Nếu bạn thực sự muốn, bạn có thể viết mã trong trình đổ bóng đầu tiên của mình để xuất thủ công các thứ như độ sâu, đến một tệp đính kèm kết cấu màu riêng biệt trong FBO của bạn. Điều đó sẽ được sử dụng bởi bạn trong các shader sau khi vượt qua của bạn. Để sử dụng OpenGL trong thử nghiệm độ sâu bên trong của nó, bạn cũng cần thêm RBO hoặc kết cấu được đặt làm GL_DEPTH_ATTACHMENT của FBO. Nhưng bạn có thể thiết lập một kết cấu duy nhất để phục vụ cả hai - điều này hiệu quả hơn & dễ sử dụng hơn.
Mã thiết lập kết cấu chiều sâu của tôi trông như thế này (Java, chỉ cần bỏ qua công cụ ByteBuffer ... và lưu ý tôi sử dụng "id" để chỉ các thẻ điều khiển / con trỏ số nguyên, vì khái niệm đó không thực sự phù hợp với Java):
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);
Và sau đó:
glBindFrameBuffer(GL_DRAW_FRAMEBUFFER, fbo.id);
//your existing glFramebufferTexture2D(...) calls here
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, gBufferDepthTexture.id, 0);
Bây giờ bạn có thể vượt qua gBufferDepthTexture
(hoặc những gì có bạn) như một bộ đồng phục cho các shader mảnh thứ hai, thứ ba của bạn. Tôi nghĩ rằng chúng ta có thể giả định một cách an toàn rằng bạn có thể thực hiện chính xác điều tương tự với bộ đệm stpson.