C++ GLSL和FBOs-glActiveTexture不';不行?

C++ GLSL和FBOs-glActiveTexture不';不行?,c++,opengl,glsl,fbo,C++,Opengl,Glsl,Fbo,我正在尝试编写一个简单的着色器,可以添加附加到FBO的纹理。FBO初始化之类的东西没有问题(我已经测试过了)。问题是我相信 玻璃纹理(GL_纹理0)。它似乎什么也没做-这是我的frag着色器: (但通常称为着色器-我已经通过将gl_FragColor=vec4(0,1,0,1)进行了测试) 在C++代码中,我有: glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, iFrameBufferAccumulation); glDrawBuffer(GL_COLO

我正在尝试编写一个简单的着色器,可以添加附加到FBO的纹理。FBO初始化之类的东西没有问题(我已经测试过了)。问题是我相信 玻璃纹理(GL_纹理0)。它似乎什么也没做-这是我的frag着色器: (但通常称为着色器-我已经通过将gl_FragColor=vec4(0,1,0,1)进行了测试)

在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)

我检查了其余的,它工作正常

还有一个愚蠢的问题:

如何在整个屏幕上渲染纹理

我曾经尝试过类似的方法,但没有成功(我必须在这个四元组中翻译一点)

也不适用于glVertex2f

编辑:我已经签出,我可以初始化一些统一的变量只有纹理是有问题的


我已经更改了顺序,但它仍然不起作用。:(顺便说一句,其他制服值工作正常。我已经显示了我想传递给着色器的纹理。它工作正常。但由于未知原因,纹理采样器未在片段着色器中初始化。可能与此纹理为GLTEXAGE2D有关(GL_纹理_矩形_NV,0,GL_RGB16F/GL_FLOAT _R32 _NV/,OPT.m_nWidth,OPT.m_nHeight,0,GL_RED,GL_FLOAT,NULL);(它不是GL_纹理_2D)

你的
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纹理。

现在还不清楚你的
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);
glActiveTexture(GL_TEXTURE0); 

glBindTexture( GL_TEXTURE_RECTANGLE_NV, iTextureImgAccumulation ); // Bind our frame buffer texture 
xShader.setUniform1i("Texture0", 0);
“是”可以渲染FBO纹理,并在另一个上下文的着色器中使用它

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, your_fbo_id);
// render to FBO there
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
然后以与使用常规纹理相同的方式使用FBO纹理

glActiveTexture(GL_TEXTURE0); 

glBindTexture( GL_TEXTURE_RECTANGLE_NV, iTextureImgAccumulation ); // Bind our frame buffer texture 
xShader.setUniform1i("Texture0", 0);
这是一个矩形纹理

uniform sampler2D Texture0;
这是一个2D纹理。它们不是相同的东西。必须与匹配。如果您的GLSL版本支持,则需要使用
SampleRect

这是一个矩形纹理

uniform sampler2D Texture0;

这是一个2D纹理。它们不是同一件事。必须与匹配。假设您的GLSL版本支持,您需要使用
SampleRect

为什么要使用纹理矩形?如果使用“normal”,它可能会起作用纹理。OpenGL 2.0及以上版本完全支持npot纹理。我不理解你的意思。我使用GL_纹理_矩形_NV和GL_RGB16F,我相信这是npot纹理。顺便说一句,我尝试过使用GL_浮动_R32_NV,但它不起作用(如果需要,我需要对其进行着色器吗?)这也是一个愚蠢的问题:你不会问两个问题。你一次只问一个问题。如果你有“另一个愚蠢的问题”,那么你可以用
问问题
按钮问另一个问题。很抱歉没有这么精确…“正常”纹理对我来说是指“GL_纹理_2D”而不是“GL_纹理_矩形”为什么要使用纹理矩形?如果使用“正常”可能会起作用纹理。OpenGL 2.0及以上版本完全支持npot纹理。我不理解你的意思。我使用GL_纹理_矩形_NV和GL_RGB16F,我相信这是npot纹理。顺便说一句,我尝试过使用GL_浮动_R32_NV,但它不起作用(如果需要,我需要对其进行着色器吗?)这也是一个愚蠢的问题:你不会问两个问题。你一次只问一个问题。如果你有“另一个愚蠢的问题”,那么你可以用
问问题
按钮问另一个问题。很抱歉,我说的“正常”纹理是指“GL\U纹理\U 2D”而不是“GL\U纹理\U矩形\U NV”非常感谢我测试了它,更改了顺序但仍然不起作用。非常感谢我测试了它,更改了顺序但仍然不起作用。非常感谢。我相信我现在走上了正确的轨道:))现在只剩下将我的着色器升级到140版。你能推荐一些好的教程吗?非常感谢。我相信我现在走上了正确的轨道:))只需将我的着色器升级到版本140即可。。你能推荐一些好的教程吗?