2011-09-09 167 views
5

我对帧缓冲区有点困惑。我想要做的是使用附加了多个纹理的帧缓冲区,填充每个纹理,然后使用着色器组合(混合)所有纹理以创建新的输出。听起来很容易?是的,这也是我的想法,但我不明白。framebuffer和在opengl中使用着色器

如何将当前绑定的纹理传递给着色器?

回答

8

您需要将纹理放入特定插槽,然后使用采样器从中读取纹理。在您的应用程序:

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 

而在你的片段着色器:

uniform sampler2D yourSampler; 

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

您可以GL_TEXTURE2使用这一点,所以在你的着色器访问更加质感。

+0

而且我将不得不选择drawbuffer,对吧?因此具有类似于: glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); \t glActiveTexture(GL_TEXTURE1); \t glBindTexture(GL_TEXTURE_2D,yourTexture); //绘制 GLint var = glGetUniformLocationARB(yourShaderProgram,“yourSampler”); glUniform1i(var,1); glUniform1i(var,1); //我们在这里使用1,因为我们使用GL_TEXTURE1来绑定纹理 – Donny

+3

@Donny您正在混合两个完全不同的东西(即渲染帧缓冲区并从先前渲染的纹理读取)。 –

+0

我想要做的就是渲染到一个帧缓冲区,将该结果渲染到着色器中。这个想法是,我可以通过渲染到帧缓冲区来创建许多不同的纹理。因此我想混合所有这些纹理。 这可能吗? – Donny