【发布时间】:2012-05-18 18:12:46
【问题描述】:
我正在尝试编写一个简单的着色器,它将添加附加到 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)?
【问题讨论】:
-
为什么要使用纹理矩形?如果您使用“正常”纹理,它可能会起作用。在 OpenGL 2.0 及更高版本中完全支持 npot 纹理。
-
我不明白你的意思。我将 GL_TEXTURE_RECTANGLE_NV 与 GL_RGB16F 一起使用,我相信它是 NPOT 纹理。顺便说一句,我尝试使用 GL_FLOAT_R32_NV 但它没有用(如果是这样,我是否需要为此着色?)
-
“又是一个愚蠢的问题:”你不会问两个问题。你一次问一个问题。如果您有“另一个愚蠢的问题”,那么您可以使用
按钮提出另一个问题。 -
抱歉没有那么精确...“正常”纹理对我来说是指“GL_TEXTURE_2D”而不是“GL_TEXTURE_RECTANGLE_NV”