我想加載OpenCV的圖像(JPG和PNG)作爲OpenGL紋理。OpenCV圖像加載OpenGL紋理
這是我如何加載圖像到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);那麼該對象以不同的顏色着色。
不幸的是,當我想應用紋理時,屏幕保持黑色......有人可以幫助我,告訴我爲什麼會一直保持黑色?
那麼這樣工作嗎?順便說一句,你爲什麼改變濾波器和鉗位模式?爲什麼在不使用mipmapping過濾器的情況下生成mipmap? –
是的,它是以這種方式工作 - 當然不是最好的解決方案,並且有很大的改進潛力 - 但它工作正常 - 而且mipmap將作爲下一個功能實現,我忘記刪除行 – glethien
我正在使用你的方法來顯示圖像,但我得到了使用image.ptr()的讀訪問衝突。請參閱我的帖子在這裏:https://stackoverflow.com/questions/45013214/qt-signal-slot-cvmat-unable-to-read-memory-access-violation#45014271 – Pete