2011-09-09 22 views
5

フレームバッファについてはかなり混乱しています。私がしたいのは、複数のテクスチャが添付されたフレームバッファを使用し、すべてのテクスチャを塗りつぶした後、シェーダを使用してすべてのテクスチャを結合(ブレンド)して新しい出力を作成することです。簡単に聞こえますか?ええ、それは私が思ったものですが、私はそれを理解していません。フレームバッファと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

さらに、ドローバッファを選択する必要があります。 glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);したがって、 のようなものを持つ ; \t glActiveTexture(GL_TEXTURE1); \t glBindTexture(GL_TEXTURE_2D、yourTexture); //描画 GLint var = glGetUniformLocationARB(yourShaderProgram、 "yourSampler"); glUniform1i(var、1); // GL_TEXTURE1を使用してテクスチャをバインドしているため、ここでは1を使用します。 – Donny

+3

@Donny 2つの全く異なるものを混在させています(フレームバッファへのレンダリングと以前にレンダリングされたテクスチャからの読み込み)。 –

+0

私がしようとしているのは、フレームバッファーにレンダリングし、その結果をシェーダーに取り込むことです。アイデアは、フレームバッファにレンダリングすることによって、どのように多くの異なるテクスチャを生成できるのかということです。結果として、私はこれらのテクスチャをすべて混ぜていきたいと思います。 これは可能ですか? – Donny

関連する問題