当前位置: 首页 > 知识库问答 >
问题:

GLSL和FBOs——glActiveTexture不起作用?

须峰
2023-03-14

我正在尝试编写一个简单的着色器,可以添加附加到FBO的纹理。FBO初始化等方面没有问题(我已经测试过了)。问题在于我相信glActiveTexture(GL_TEXTURE0)的应用。它似乎什么都没做——这是我的frag着色器(但通常称为着色器)——我已经通过将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)?

共有2个答案

刘狐若
2023-03-14
glActiveTexture(GL_TEXTURE0); 

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

这是一个矩形纹理。

uniform sampler2D Texture0;

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

宿建本
2023-03-14

不清楚您的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纹理。

 类似资料:
  • 我遇到了一个非常奇怪的问题,它似乎起源于片段着色器中的一个简单乘法 我正在尝试使用帧缓冲区计算阴影,该帧缓冲区仅从“灯光透视图”渲染深度,这是初学者的常见技术,易于实现 片段着色器: main()中的最后一个乘法运算表现得很奇怪,将漫反射光的结果乘以纹理颜色可以很好地渲染(因此我们没有阴影,只有漫反射闪电) 将漫反射光乘以阴影结果也可以很好地渲染(现在我们没有纹理) 将所有这些结合起来,只渲染一个

  • 问题内容: 我现在有两个类:RemindersDAO.java和ViewLocalReminders.java。 我试图访问ViewLocalReminders.java中的变量,并且试图从RemindersDAO.java调用它。我通过使用getter / setter方法组合来做到这一点。但是,由于某种原因,我的变量值在getter方法中一直设置为0。这是代码: ViewLocalRemind

  • 问题内容: 我现在有两个类:RemindersDAO.java和ViewLocalReminders.java。 我试图访问ViewLocalReminders.java中的变量,并且试图从RemindersDAO.java调用它。我通过使用getter / setter方法组合来做到这一点。但是,由于某种原因,我的变量值在getter方法中一直设置为0。这是代码: ViewLocalRemind

  • 我有一个基本的OpenGL应用程序,我想使用我的投影矩阵。 这是我的矩阵: (WorldCoordinates是Matrix4结构,它只包含一个名为m的变量,即浮点[4][4])(宽度和高度是两个s)。然后,我使用以下方法将此坐标应用于我的<code>顶点 (Shader是一个类,并且有一个绑定()方法,它只是glUseProgram)。 这是我的顶点着色器GLSL 使用这个,它不起作用。但将gl

  • 我已经尝试使用Config Server实现spring外部配置。当应用程序启动时,它第一次工作得很好,但对属性文件的任何更改都不会反映出来。我试图使用/refreshendpoint来动态刷新我的属性,但它似乎不起作用。在这方面的任何帮助都将是非常有帮助的。 我尝试向localhost:8080/refresh发帖,但得到404错误响应。 下面是我的应用程序类的代码 和bootstrap.pro

  • 因此,我在一个控制器中有一个非常简单的代码片段,在这个代码片段中,我使用从外部文件中获取数据,它工作得很好!但是当我使用时,我会在控制台中得到一个