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

片段着色器的OpenGL GLSL绑定采样器

王辉
2023-03-14

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

这是我绘制到帧缓冲区对象的场景,然后从那里绘制到屏幕。使用箭头键可以让月亮四处移动(我很自豪!)

但是,当我尝试使用着色器程序将帧缓冲区对象渲染到屏幕上时,我得到以下结果:

这是非常可悲的。这个片段着色器是我从一个教程中得到的,我相信问题一定是统一变量。

以下是片段着色器:

#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_纹理)渲染到屏幕上

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();
}

共有1个答案

华睿识
2023-03-14

如何为采样器设置统一值确实存在问题:

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

需要为统一设置的值是纹理单位的索引,而不是相应的枚举值。由于在本例中使用的是纹理单元0,因此需要将glUniform1i()调用替换为:

glUniform1i(gSampler, 0);
 类似资料:
  • 我需要一个着色程序,然后我需要一个着色程序。一旦我从我的着色器中获得和后,是否可以将它们作为采样器发送到着色器中,以便在屏幕上渲染到四元体上? 我需要将颜色附件发送到第二个着色器的原因是,我正在不同的监视器上渲染和将出现在一个屏幕上,而将出现在另一个屏幕上。。。 我正在做测试视力的心理实验。我的第一个着色器处理我的原始纹理集,但由于两个输出纹理所需的大部分处理是相同的,所以如果不需要,我基本上不想

  • 片段着色器调用每个需要渲染的像素。我们将开发一个红色透镜,它将会增加图片的红色通道的值。 配置场景(Setting up the scene) 首先我们配置我们的场景,在区域中央使用一个网格显示我们的源图片(source image)。 import QtQuick 2.0 Rectangle { width: 480; height: 240 color: '#1e1e1e'

  • 我对如何将纹理绑定到GLSL中的插槽有点困惑。以下是我的着色器: 当我设置矩阵时,我需要查询统一位置,然后手动设置该位置的值,执行如下操作: 然而,据我所知,我不需要这样做来初始化我的纹理采样器。在设置时,我似乎只需要这样做: 所以,我的问题是,为什么我不需要对纹理进行与矩阵相同的处理?OpenGL运行时如何“知道”我绑定的纹理应该是我定义的采样器?如果我想拥有多种纹理,我该怎么做呢?

  • 我是OpenGL的新手,在整理如何将纹理和着色器绑定到VBOs时遇到了困难。 我正在使用Cinder的纹理和着色器类。以下是我绘制方法的一部分: 在上面的代码中,如果我注释掉对mShader的调用。bind(),我的球体VBO将显示纹理(myImage)。我的着色器适用于普通(无纹理)形状,但当我在绘制任何带有包裹纹理的形状之前绑定着色器时,它会阻止纹理显示。 这是我使用的着色器的问题,还是我不理

  • 如何使用片段着色器绘制一条线或一条曲线? 我有一个程序,根据用户指定的一组顶点计算贝塞尔曲线。在早期,我非常简单,只需在应用程序端处理每个顶点,就可以根据三次贝塞尔曲线方程生成一组插值点: ... 然后将所有处理过的顶点存储到GL_VERTEX_数组中,以便使用glDrawArrays(GL_LINE_STRIP,0,myArraySize)绘制。虽然解决方案很简单,但此实现的时间复杂度为O(n^

  • WebGL的着色器代码分为顶点着色器代码和片元着色器代码两部分,顶点着色器代码会在GPU的顶点着色器单元执行,片元着色器代码会在GPU的片元着色器单元执行,在WebGL渲染管线流程中,或者说GPU的渲染流程中,顶点着色器代码先执行处理顶点,得到一系列片元,然后再执行片元着色器代码处理片元。 main()函数 顶点着色器和片元着色器代码都有一个唯一的主函数main(),attribute、varyi