我正在尝试编写一个简单的着色器,它会添加附加到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)?
答案 0 :(得分: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);
和'yes'你可以渲染FBO纹理并在另一个上下文中的着色器中使用它
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, your_fbo_id);
// render to FBO there
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
然后使用你的FBO纹理,就像使用常规纹理一样。
答案 1 :(得分:2)
glActiveTexture(GL_TEXTURE0);
glBindTexture( GL_TEXTURE_RECTANGLE_NV, iTextureImgAccumulation ); // Bind our frame buffer texture
xShader.setUniform1i("Texture0", 0);
这是一个矩形纹理。
uniform sampler2D Texture0;
这是2D纹理。他们不是同一件事。 sampler type 必须与texture type匹配。假设您的GLSL版本支持该版本,则需要使用samplerRect
。