0

FBO にアタッチされたテクスチャを追加する単純なシェーダーを作成しようとしています。FBOの初期化などには問題ありません(テスト済み)。問題は、glActiveTexture(GL_TEXTURE0) だと思います。何もしていないようです-これが私のフラグシェーダーです:(しかし、一般的にシェーダーが呼び出されます-私は gl_FragColor = vec4(0,1,0,1); を置くことによってそれをテストしました;

 uniform sampler2D Texture0;
 uniform sampler2D Texture1;
 varying vec2 vTexCoord;
 void main()
 {
     vec4 texel0 = texture2D(Texture0, gl_TexCoord[0].st);
     vec4 vec = texel0; 
     gl_FragColor = texel0;     
 }

そして、C++コードには次のものがあります:

 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, iFrameBufferAccumulation); 

 glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
 ( Render something - it works fine to iTextureImgAccumulation texture attached to     GL_COLOR_ATTACHMENT0_EXT )
 glClear (GL_COLOR_BUFFER_BIT );
 glEnable(GL_TEXTURE_RECTANGLE_NV);


 glActiveTexture(GL_TEXTURE0); 

 glBindTexture( GL_TEXTURE_RECTANGLE_NV, iTextureImgAccumulation ); // Bind our frame buffer texture 
 xShader.setUniform1i("Texture0", 0);

 glLoadIdentity(); // Load the Identity Matrix to reset our drawing locations 
 glTranslatef(0.0f, 0.0f, -2.0f); 
 xShader.bind();        
 glBegin(GL_QUADS);

     glTexCoord2f(0,OPT.m_nHeight);
     glVertex3f(-1,-1,0);

 glTexCoord2f(OPT.m_nWidth,OPT.m_nHeight);
 glVertex3f(1,-1,0);

 glTexCoord2f(OPT.m_nWidth,0);
 glVertex3f(1,1,0);

 glTexCoord2f(0,0);
 glVertex3f(-1,1,0);

 glEnd();

 glBindTexture( GL_TEXTURE_RECTANGLE_NV, NULL ); 

 xShader.unbind();

結果: 黒い画面 (2 番目のテクスチャを表示し、シェーダーを使用する場合 (シェーダーを使用しない場合)物事をテストしていますが、アイデアは、最初のテクスチャにレンダリングした後、最初のテクスチャを2番目のテクスチャに追加することです.これを行うには、このフラグメントシェーダが機能すると思います:

 uniform sampler2D Texture0;
 uniform sampler2D Texture1;
 varying vec2 vTexCoord;
 void main()
 {
     vec4 texel0 = texture2D(Texture0, gl_TexCoord[0].st);
     vec4 texel1 = texture2D(Texture1, gl_TexCoord[0].st);
     vec4 vec = texel0 + texel1;
     vec.w = 1.0;
     gl_FragColor = vec;    
 }

そして、全体的なアイデアは、ループ tex2 = tex2 + tex1 であるということです (このシェーダーで tex2 を使用して、tex2 にアタッチされている GL_COLOR_ATTACHMENT1_EXT にレンダリングすることは可能でしょうか?) xShader.bind(); の両方をテストしました。均一変数を初期化する前と後。どちらの場合も - 黒い画面。

とにかく、しばらくの間、テクスチャのサンプラーの初期化に問題があると確信しています (FBO に接続されている可能性があります)。

私は残りをチェックしました、そしてそれはうまくいきます。

また、別のばかげた問題:

画面全体にテクスチャをレンダリングするにはどうすればよいですか?

私はそのようなことを試しましたが、うまくいきません(このクワッドを少し翻訳する必要があります)

glViewport(0,0 , OPT.m_nWidth, OPT.m_nHeight);

glBindTexture( GL_TEXTURE_RECTANGLE_NV, iTextureImg/*iTextureImgAccumulation*/ ); // Bind our frame buffer texture 

glBegin(GL_QUADS);
glTexCoord2f(0,OPT.m_nHeight);
glVertex3f(-1,-1,0);

glTexCoord2f(OPT.m_nWidth,OPT.m_nHeight);
glVertex3f(1,-1,0);

glTexCoord2f(OPT.m_nWidth,0);
glVertex3f(1,1,0);

glTexCoord2f(0,0);
glVertex3f(-1,1,0);

glEnd();

glVertex2f でも動作しません。

編集:チェックアウトしましたが、テクスチャのみが問題であるいくつかの均一な変数を初期化できます。

順序を変更しましたが、まだ機能しません.:(ところで、他のユニフォームの値はうまく機能しています.シェーダーにも渡したいテクスチャを表示しました.正常に動作します.しかし、不明な理由でテクスチャサンプラーが初期化されていません.おそらく、このテクスチャが glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_RGB16F / GL_FLOAT_R32_NV /, OPT.m_nWidth, OPT.m_nHeight, 0, GL_RED, GL_FLOAT, NULL); (GL_TEXTURE_2D ではない)

4

2 に答える 2

2
glActiveTexture(GL_TEXTURE0); 

glBindTexture( GL_TEXTURE_RECTANGLE_NV, iTextureImgAccumulation ); // Bind our frame buffer texture 
xShader.setUniform1i("Texture0", 0);

これは長方形のテクスチャです。

uniform sampler2D Texture0;

これは 2D テクスチャです。それらは同じものではありませんサンプラー タイプは、 テクスチャ タイプと一致する必要があります。GLSL のバージョンがそれをサポートしていると仮定すると、を使用する必要があります。samplerRect

于 2012-05-10T18:34:29.540 に答える
2

あなたが何をしているのかははっきりしていませんがxShader.bind()、あなたがglUseProgram(...)そこでしていると推測できます。glUseProgram(...)ただし、が呼び出された後に均一変数 (この場合はサンプラー インデックス) を設定する必要があります。この順序で:

glUseProgram(your_shaders); //probably your xShader.bind() does it.

GLuint sampler_idx = 0; 
GLint location = glGetUniformLocation(your_shaders, "Texture0");
if(location != -1) glUniform1i(location, sampler_idx);
else error("cant, get uniform location");

glActiveTexture(GL_TEXTURE0 + sampler_idx);
glBindTexture(GL_TEXTURE_2D, iTextureImg);

「はい」FBO テクスチャをレンダリングし、別のコンテキストのシェーダーで使用できます

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, your_fbo_id);
// render to FBO there
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

次に、通常のテクスチャを使用するのと同じ方法で FBO テクスチャを使用します。

于 2012-05-10T13:35:23.333 に答える