GLSL 和 FBO - glActiveTexture 不起作用?
GLSL and FBOs - glActiveTexture doesn't work?
我正在尝试编写一个简单的着色器,它将添加附加到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(?
你的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 纹理。
glActiveTexture(GL_TEXTURE0);
glBindTexture( GL_TEXTURE_RECTANGLE_NV, iTextureImgAccumulation ); // Bind our frame buffer texture
xShader.setUniform1i("Texture0", 0);
这是一个矩形纹理。
uniform sampler2D Texture0;
这是一个 2D 纹理。它们不是一回事。采样器类型必须与纹理类型匹配。您需要使用samplerRect
,假设您的 GLSL 版本支持此功能。
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 嵌套While循环不起作用(C++问题)
- C++Matching Brackets 2解决方案不起作用
- 为什么这段代码不起作用,我该如何解决?
- 我正在开发服务器,ip作为参数传递不起作用