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();

结果:黑屏(显示第二个纹理并使用着色器时(不使用着色器很好)。我知道这个着色器不应该做太多,但他甚至不显示第一个纹理。我在中间测试的东西,但想法是在渲染到第一个纹理后,我会将第一个纹理添加到第二个纹理。为此,我想这个片段着色器可以工作:

 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

目前还不清楚你的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 回答
2
glActiveTexture(GL_TEXTURE0); 

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

这是一个矩形纹理。

uniform sampler2D Texture0;

这是一个 2D 纹理。他们不是一回事。采样器类型 必须纹理类型匹配。您需要使用samplerRect,假设您的 GLSL 版本支持它。

于 2012-05-10T18:34:29.540 回答