Lum*_*ire 1 c++ opengl 2d glsl fragment-shader
我希望在2D OpenGL应用程序上实现着色器.我的计划是将场景渲染到帧缓冲对象,然后使用着色器将该帧缓冲对象渲染到屏幕.
这是场景,我已经绘制到帧缓冲对象,然后从那里到屏幕.使用箭头键使月亮移动(我为此感到自豪!)

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

这是非常可悲的.这个片段着色器是我从教程中得到的,我确定问题必须是统一变量.
这是片段着色器:
#version 330
in vec2 texCoord;
out vec4 outputColor;
uniform sampler2D gSampler;
void main()
{
outputColor = texture2D(gSampler, texCoord);
}
Run Code Online (Sandbox Code Playgroud)
以下是我设置统一变量的方法:
gSampler = glGetUniformLocation(mProgramID, "gSampler");
glUniform1i(gSampler, GL_TEXTURE0);
Run Code Online (Sandbox Code Playgroud)
以下是使用我的着色器程序(mProgramID)将Framebuffer(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();
Run Code Online (Sandbox Code Playgroud)
所以我的问题是 - 纹理和采样器之间的联系是什么?如果着色器已经对纹理进行采样,是否需要渲染纹理四边形?如果着色器正在纹理化,为什么不渲染空白四边形呢?
编辑:这是顶点着色器:
void main()
{
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = ftransform();
}
Run Code Online (Sandbox Code Playgroud)
如何为采样器设置统一值确实存在问题:
gSampler = glGetUniformLocation(mProgramID, "gSampler");
glUniform1i(gSampler, GL_TEXTURE0);
Run Code Online (Sandbox Code Playgroud)
您需要为均匀设置的值是纹理单元的索引,而不是相应的枚举值.由于在这种情况下使用纹理单元0,因此需要通过以下方式替换glUniform1i()调用:
glUniform1i(gSampler, 0);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4345 次 |
| 最近记录: |