我想用 OpenCV 作为 OpenGL 纹理加载图像(jpg 和 png)。
这是我将图像加载到 OpenGL 的方式:
glEnable(GL_TEXTURE_2D);
textureData = loadTextureData("textures/trashbin.png");
cv::Mat image = cv::imread("textures/trashbin.png");
if(image.empty()){
std::cout << "image empty" << std::endl;
}else{
glGenTextures( 1, &textureTrash );
glBindTexture( GL_TEXTURE_2D, textureTrash );
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S , GL_REPEAT );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
glTexImage2D(GL_TEXTURE_2D,0,3,image.cols, image.rows,0,GL_RGB,GL_UNSIGNED_BYTE, image.data);
}
图像已加载,因为“image.empty”总是返回 false
以下是我使用创建的纹理渲染场景的方法:
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureTrash);
glm_ModelViewMatrix.top() = glm::translate(glm_ModelViewMatrix.top(),0.0f,-13.0f,-10.0f);
glUniformMatrix4fv(uniformLocations["modelview"], 1, false, glm::value_ptr(glm_ModelViewMatrix.top()));
std::cout << "textureShaderID: " << glGetUniformLocation(shaderProgram,"texture") << std::endl;
glUniform1i(glGetUniformLocation(shaderProgram,"texture"), 0);
objLoader->getMeshObj("trashbin")->render();
最后是我想将纹理应用到几何体的 fragmentShader
#version 330
in vec2 tCoord;
// texture //
// TODO: set up a texture uniform //
uniform sampler2D texture;
// this defines the fragment output //
out vec4 color;
void main() {
// TODO: get the texel value from your texture at the position of the passed texture coordinate //
color = texture2D(texture, tCoord);
}
纹理坐标来自顶点缓冲区对象,并从 .obj 文件中正确设置。当我在片段着色器中将颜色设置为例如红色或 vec4(tCoord,0,1); 时,我也可以在场景中看到对象。然后对象以不同的颜色着色。
不幸的是,当我想应用纹理时屏幕保持黑色......有人可以帮助我并告诉我为什么保持黑色?