c++ - 用于片段着色器的 OpenGL GLSL 绑定(bind)采样器

标签 c++ opengl 2d glsl fragment-shader

我希望在 2D OpenGL 应用程序上实现着色器。我的计划是将场景渲染到帧缓冲区对象,然后使用着色器将该帧缓冲区对象渲染到屏幕。

这是场景,我已将其绘制到帧缓冲区对象,然后从那里绘制到屏幕。使用箭头键让月亮四处移动(我为此感到非常自豪!)

Screen 1

但是,当我尝试使用我的着色器程序将帧缓冲区对象渲染到屏幕时,我得到了这个:

Screen 2

很伤心。这个片段着色器是我从 tutorial 得到的。 ,我确定问题出在统一变量上。

这是片段着色器:

#version 330

in vec2 texCoord;
out vec4 outputColor;

uniform sampler2D gSampler;

void main()
{
   outputColor = texture2D(gSampler, texCoord);
}

这是我设置统一变量的方法:

gSampler = glGetUniformLocation(mProgramID, "gSampler");
glUniform1i(gSampler, GL_TEXTURE0);

下面是我如何使用着色器程序 (mProgramID) 将帧缓冲区 (fbo_texture) 渲染到屏幕上

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,    0 ); 

glUseProgram(mProgramID);
glColor3f(1.0, 1.0, 1.0);
glEnable(GL_TEXTURE_2D);

glActiveTexture(GL_TEXTURE0 + 0);
glBindTexture(GL_TEXTURE_2D, fbo_texture);

glBegin(GL_QUADS);x1= 0.0;x2= 400.0;y1= 0.0;y2 = 400.0;
    glTexCoord2f(0.0f, 1.0f); glVertex2f(x1, y1);
    glTexCoord2f(0.0f, 0.0f); glVertex2f(x1, y2);
    glTexCoord2f(1.0f, 0.0f); glVertex2f(x2, y2);
    glTexCoord2f(1.0f, 1.0f); glVertex2f(x2, y1);

glEnd();glDisable(GL_TEXTURE_2D);

SDL_GL_SwapBuffers();

所以我的问题是 - 纹理和采样器之间的联系是什么?如果着色器已经对纹理进行采样,我是否需要渲染带纹理的四边形?如果着色器正在对它进行纹理化,为什么不只渲染一个空白四边形呢?

编辑:这是顶点着色器:

void main()
{

    gl_TexCoord[0] = gl_MultiTexCoord0;
    gl_Position = ftransform();
}

最佳答案

您为采样器设置统一值的方式确实存在问题:

gSampler = glGetUniformLocation(mProgramID, "gSampler");
glUniform1i(gSampler, GL_TEXTURE0);

uniform需要设置的值是纹理单元的索引,而不是对应的枚举值。由于在这种情况下您使用的是纹理单元 0,因此您需要通过以下方式替换 glUniform1i() 调用:

glUniform1i(gSampler, 0);

关于c++ - 用于片段着色器的 OpenGL GLSL 绑定(bind)采样器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24131541/

相关文章:

C++ openGL - 获取和设置像素的函数

c++ - 使用 FBO 的 OpenGL 着色管道效率

javascript - 在使用 pdf.js 渲染的 Canvas 上平移 pdf 文件时出现问题?

c++ - 在元组上泛化 for_each 以接受可变数量的参数

c++ - MySQL C API : How to work with row from mysql_fetch_row()?

opengl - OpenGL透视投影

java - java中二维数组的输出表

3d - 如何从平面相交的 3D 几何体中提取 2D 切片?

c++ - C++ 中的模板类和方法

c++ - 为什么将这些 C++ header 指定为包含 <initializer_list>?