5
我對幀緩衝區有點困惑。我想要做的是使用附加了多個紋理的幀緩衝區,填充每個紋理,然後使用着色器組合(混合)所有紋理以創建新的輸出。聽起來很容易?是的,這也是我的想法,但我不明白。framebuffer和在opengl中使用着色器
如何將當前綁定的紋理傳遞給着色器?
我對幀緩衝區有點困惑。我想要做的是使用附加了多個紋理的幀緩衝區,填充每個紋理,然後使用着色器組合(混合)所有紋理以創建新的輸出。聽起來很容易?是的,這也是我的想法,但我不明白。framebuffer和在opengl中使用着色器
如何將當前綁定的紋理傳遞給着色器?
您需要將紋理放入特定插槽,然後使用採樣器從中讀取紋理。在您的應用程序:
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
使用這一點,所以在你的着色器訪問更加質感。
而且我將不得不選擇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
@Donny您正在混合兩個完全不同的東西(即渲染幀緩衝區並從先前渲染的紋理讀取)。 –
我想要做的就是渲染到一個幀緩衝區,將該結果渲染到着色器中。這個想法是,我可以通過渲染到幀緩衝區來創建許多不同的紋理。因此我想混合所有這些紋理。 這可能嗎? – Donny