第二个纹理没有出现在glsl着色器中

时间:2014-05-11 20:37:11

标签: opengl textures glsl

我很困惑为什么我无法使用GLSL在我的着色器中显示纹理。

首先,我为FBO渲染一个平面颜色并将其复制到我的纹理。

        GLuint textureId;
        glGenTextures(1, &textureId);

        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, textureId);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);

        _transferFbo->bind();
        glClearColor(1,0.5,.5,1);
        glClear(GL_COLOR_BUFFER_BIT);

        glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 256, 256, 0);

        _transferFbo->release();

如果我在没有使用glEnable(GL_TEXTURE_2D)的着色器的情况下使用此纹理,它可以正常工作。我也尝试在调试着色器中使用它,四边形填充屏幕并再次起作用,所以我认为我的纹理至少部分正确。

然后我尝试在着色器中使用纹理,我已经在使用另一个纹理,并且在采样时我什么也得不到。

_meshShader->bind();
_meshShader->setUniformValue("objToWorld", objToWorld);
_meshShader->setUniformValue("cameraPV", cameraProjViewM);
_meshShader->setUniformValue("meshTexture", 0);
_meshShader->setUniformValue("paintTexture", 1);
_meshShader->setUniformValue("paintFboWidth", PAINT_FBO_WIDTH);

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, _meshTextures[mesh]); // not working
    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_2D, _paintFbo->texture()); // working
    glActiveTexture(GL_TEXTURE0);

在我的着色器中,我将网格uvs映射到输出颜色,值似乎合理。然而,当我尝试从该纹理采样时,我得到的只是黑色。我甚至尝试将UV值硬编码为.5,.5只是为了确保我能得到一个平坦值,但它又是黑色的。我也尝试过交换纹理单元,使油漆纹理成为第一,但这并没有改变。在这个使这个纹理变黑的着色器中,我可能做错了什么?

                   #version 120
                   varying vec3 worldPos;
                   varying vec2 uv;
                   uniform vec3 cameraPos;
                   uniform sampler2D meshTexture;
                   uniform sampler2D paintTexture;
                   uniform int paintFboWidth;
                   void main() {
                       vec2 paintUvs = vec2(gl_FragCoord.x/paintFboWidth, gl_FragCoord.y/paintFboWidth);

                       gl_FragColor = texture2D(paintTexture, paintUvs);

                       // this is just for testing -- this half of the quad is
                       // always black
                       if (uv.t > 0.5) gl_FragColor = texture2D(meshTexture, uv);
                   }

修改

这是完整OpenGL代码的链接 https://github.com/strattonbrazil/paintbug/blob/master/glview.cpp

这里有一个屏幕截图,你可以看到红色纹理正在工作,而黑色部分,应该是一个肉色的黑色。

quad with half of texture working

0 个答案:

没有答案
相关问题