2011-09-09 21 views
5

Çerçevebacker'lar hakkında biraz kafam karıştı. Yapmak istediğim, çoklu dokuları olan bir çerçevebuffer kullanmak, her bir dokuyu doldurmak ve daha sonra yeni bir çıktı oluşturmak için tüm dokuları birleştirmek (karıştırmak) için bir gölgelendirici kullanmak. Kolay geliyor? evet ben de öyle düşündüm, ama anlamıyorum.framebuffer ve opengl'de shader kullanma

Şu anda bağlanan dokuyu bir gölgelendiriciye nasıl geçirebilirim?

cevap

8

Yapmanız gereken şey dokuyu belirli bir yuvaya yerleştirmek, ardından okumak için bir örnekleyici kullanmaktır. Uygulamanızda:

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 

Ve parça gölgelendirici:

uniform sampler2D yourSampler; 

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

Sen gölgelendiricideki daha dokular erişmek için böyle devam GL_TEXTURE2 ile bu kullanabilirsiniz.

+0

ve ayrıca çekmeceyi seçmek zorundayım, değil mi? , bu nedenle şu gibi bir şeye sahip: glDrawBuffer (GL_COLOR_ATTACHMENT0_EXT); \t glActiveTexture (GL_TEXTURE1); \t glBindTexture (GL_TEXTURE_2D, yourTexture); // çizmek GLint var = glGetUniformLocationARB (sizinShaderProgram, "yourSampler"); glUniform1i (var, 1); // Biz burada 1 kullanıyoruz çünkü biz dokularımızı bağlamak için GL_TEXTURE1 kullandık. – Donny

+3

@Donny İki tamamen farklı şeyi karıştırıyorsunuz (yani bir çerçeveleyiciye ve daha önce oluşturulmuş bir dokudan okumaya). –

+0

Yapmaya çalıştığım şey bir çerçevebizleyiciye işlenmesi, bu sonucu bir gölgelendiriciye dönüştürmektir. Buradaki fikir şudur ki, bu, çerçevebuffer'a işleyerek birçok farklı dokuya nasıl sahip olabilirim. Sonuç olarak, tüm bu dokuları karıştırmak istiyorum. Bu mümkün mü? – Donny