2013-01-06 40 views
1

我想通过并使用纹理着色...但每次我尝试使用它即使在最简单的方式我得到黑盒子,有时是白色 - 取决于纹理我把他..莫名其妙....glsl着色器通过和渲染纹理

这里的代码片段女巫应该工作(我已经打消了我的包装,使其更容易):

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

Ofcourse我尝试绑定的纹理存在及其完整。这里是它的参数:

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); 
+0

如果在片段着色器中输出其他固定颜色,会发生什么情况? – Plow

+0

它就像一个魅力... – Krzycho

+0

它一定是某个地方愚蠢 - 我找不到什么。我尝试了一些纹理......即使是使用SOIL库从文件中加载了一些原始的海峡,每次我都会从纹理中获得纯色填充。并且它每次都从相同的纹理取得相同的颜色,取自不同的部分 - 但通常从右上角(1,1)开始。有趣的是,着色器,纹理,FBO和其他的东西工作正常,请帮助..你是我最后的希望:( – Krzycho

回答

1

就像犁在他的评论中说的,我相信这与纹理坐标没有被设置。您只设置第二个四边形的纹理坐标。第二个四元素不是用着色器程序绘制的,而是以与第一个相同的坐标绘制,这意味着它应该是完全白色的(因为glColor3f(1.0,1.0,1.0)),或者它不应该绘制(取决于在相机位置以及是否启用深度测试)。

尝试仅绘制第一个四边形,并正确设置纹理坐标。

+0

是的......就是这样! 我一直在寻找长时间在我的硬核bug代码,尽管首先寻找一些缓解...... 我的朋友在查看我的代码5分钟后发现它..但无论如何感谢您的宝贵帮助!=] – Krzycho

+0

嘿嘿,很好:)没问题! –