我试图通过并使用纹理来着色器...但是每次我尝试以最简单的方式使用它时,我都会得到黑匣子,有时是白色,这取决于我放置他的纹理..
这是女巫应该工作的代码片段(为了方便起见,我删除了包装器):
fbo->bind();
fbo->drawBuffer(0);
fbo->setClearColor( 1.0, 1.0, 1.0, 1.0);
fbo->cleanCurrentTexture();
GLuint location;
location = glGetUniformLocation( Program->getID(), "sampler");
glActiveTexture( GL_TEXTURE0 );
glBindTexture(GL_TEXTURE_2D, fbo2->getTexture(0) );
glUniform1i(location, 0);
Program->begin();
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glVertex3f( -1.0f, -1.0f, 0.0f );
glVertex3f( -1.0f, 1.0f, 0.0f );
glVertex3f( 1.0f, 1.0f, 0.0f );
glVertex3f( 1.0f, -1.0f, 0.0f );
glEnd();
Program->end();
fbo->unbind();
glColor3f(1.0,1.0,1.0);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, fbo->getTexture(0) );
glBegin(GL_QUADS);
glTexCoord2d( 0.0f, 0.0f);
glVertex3f( -1.0f, -1.0f, 0.0f );
glTexCoord2d( 0.0f, 1.0f);
glVertex3f( -1.0f, 1.0f, 0.0f );
glTexCoord2d( 1.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, 0.0f );
glTexCoord2d( 1.0f, 0.0f);
glVertex3f( 1.0f, -1.0f, 0.0f );
glEnd();
glDisable( GL_TEXTURE_2D);
顶点着色器:
#version 120
void main()
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_TexCoord[0] = gl_MultiTexCoord0;
}
片段着色器:
#version 120
uniform sampler2D sampler;
void main()
{
gl_FragColor = texture2D(sampler, gl_TexCoord[0].xy);
}
当然,我要绑定(bind)的纹理存在且完整。这是参数:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
最佳答案
正如Plow在他的评论中所说,我认为这与未设置纹理坐标有关。您仅设置第二个四边形的纹理坐标。也不使用着色器程序绘制第二个四边形,而是在与第一个四边形完全相同的坐标上进行绘制,这意味着它应该是完全白色的(因为glColor3f(1.0,1.0,1.0)
),或者根本不应该绘制(取决于相机位置以及是否启用深度测试)。
尝试仅绘制第一个四边形,并正确设置纹理坐标。