我很困惑为什么我无法使用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
这里有一个屏幕截图,你可以看到红色纹理正在工作,而黑色部分,应该是一个肉色的黑色。