Tôi muốn tải hình ảnh (jpg và png) bằng OpenCV dưới dạng OpenGL Texture.Tải hình ảnh OpenCV cho OpenGL Texture
Dưới đây là cách tôi tải hình ảnh để 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);
}
Những hình ảnh được tải, như "image.empty" luôn luôn trả về false
Dưới đây là cách tôi làm cho cảnh bằng cách sử dụng kết cấu tạo :
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();
Và cuối cùng là fragmentShader nơi tôi muốn áp dụng kết cấu hình học của tôi
#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);
}
Tọa độ kết cấu đến từ đối tượng đệm Vertex và được đặt chính xác từ tệp .obj. Ngoài ra tôi có thể thấy Object trong cảnh của mình khi tôi đặt màu thành ví dụ. màu đỏ trong bộ đổ bóng, hoặc vec4 (tCoord, 0,1); sau đó đối tượng được tô bóng màu khác nhau.
Thật không may màn hình vẫn đen khi tôi muốn áp dụng các kết cấu ... Ai đó có thể giúp tôi và cho tôi biết lý do tại sao vẫn là màu đen?
Vậy nó hoạt động theo cách này? Nhân tiện, tại sao bạn thay đổi chế độ lọc và kẹp? Và tại sao bạn tạo mipmaps trong khi không sử dụng bộ lọc mipmapping? –
Vâng nó đang hoạt động theo cách này - Chắc chắn không phải là giải pháp tốt nhất và có nhiều tiềm năng để cải thiện - Nhưng nó đang hoạt động - Và mipmaps sẽ được thực hiện như tính năng tiếp theo, tôi vừa quên xóa dòng – glethien
Tôi đang sử dụng phương pháp của bạn để hiển thị hình ảnh, nhưng tôi nhận được một sự vi phạm truy cập đọc cho việc sử dụng image.ptr(). Vui lòng xem bài đăng của tôi tại đây: https://stackoverflow.com/questions/45013214/qt-signal-slot-cvmat-unable-to-read-memory-access-violation#45014271 – Pete