2011-09-09 62 views
5

Tôi hơi bối rối về framebuffers. Những gì tôi muốn làm là sử dụng một framebuffer với nhiều kết cấu đính kèm, điền vào mỗi kết cấu và sau đó sử dụng một shader để kết hợp (pha trộn) tất cả các kết cấu để tạo ra một đầu ra mới. Nghe có vẻ dễ dàng? yeah đó là những gì tôi nghĩ quá, nhưng tôi không hiểu nó.framebuffer và sử dụng shaders trong opengl

Làm cách nào để chuyển kết cấu hiện được ràng buộc vào trình đổ bóng?

Trả lời

8

Những gì bạn cần là đặt kết cấu vào một vị trí cụ thể, sau đó sử dụng một mẫu để đọc từ nó. Trong ứng dụng của bạn:

GLuint frameBuffer; 
glGenFramebuffersEXT(1, &frameBuffer); //Create a frame buffer 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, frameBuffer); //Bind it so we draw to it 
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, yourTexture, 0); //Attach yourTexture so drawing goes into it 

//Draw here and it'll go into yourTexture. 

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); //Unbind the framebuffer so that you can draw normally again 

//Here we put the texture in slot 1. 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, yourTexture); 
glActiveTexture(GL_TEXTURE0); //Don't forget to go back to GL_TEXTURE0 if you're going to do more drawing later 

//Now we tell your shader where to look. 
GLint var = glGetUniformLocationARB(yourShaderProgram, "yourSampler"); 
glUniform1i(var, 1); //We use 1 here because we used GL_TEXTURE1 to bind our texture 

Và trong shader mảnh của bạn:

uniform sampler2D yourSampler; 

void main() 
{ 
    gl_FragColor = texture2D(yourSampler, whateverCoordinatesYouWant); 
} 

Bạn có thể sử dụng điều này với GL_TEXTURE2 và vân vân để truy cập thậm chí nhiều hơn kết cấu trong shader của bạn.

+0

và hơn nữa tôi sẽ phải chọn bộ rút gọn, phải không? do đó có một cái gì đó như: glDrawBuffer (GL_COLOR_ATTACHMENT0_EXT); \t glActiveTexture (GL_TEXTURE1); \t glBindTexture (GL_TEXTURE_2D, yourTexture); // vẽ GLint var = glGetUniformLocationARB (yourShaderProgram, "yourSampler"); glUniform1i (var, 1); // Chúng tôi sử dụng 1 ở đây vì chúng tôi sử dụng GL_TEXTURE1 để liên kết kết cấu của chúng tôi – Donny

+3

@Donny Bạn đang trộn hai thứ hoàn toàn khác nhau (cụ thể là hiển thị với bộ đệm khung và đọc từ kết cấu được hiển thị trước đó). –

+0

Những gì tôi đang cố gắng làm là hiển thị cho bộ đệm khung, lấy kết quả đó trong trình đổ bóng. Ý tưởng là cách này tôi có thể có nhiều kết cấu khác nhau tất cả các generatad bằng cách rendering vào framebuffer. Kết quả là tôi muốn kết hợp tất cả các kết cấu này. Điều này có khả thi không? – Donny

Các vấn đề liên quan