Я хочу загрузить изображение (jpg и png) с OpenCV в качестве текстуры OpenGL.Загрузка изображения OpenCV для OpenGL Texture
Вот как я загрузить изображение в 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» всегда возвращает ложь
Вот как я сделать сцену, используя созданную текстуру :
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); то объект затенен в разный цвет.
К сожалению, экран остается черным, когда я хочу применить текстуру ... Может ли кто-нибудь помочь мне и сказать, почему остается черным?
Как это работает? Кстати, почему вы изменили режимы фильтра и зажима? И почему вы генерируете mipmaps, не используя фильтр mipmapping? –
Да, он работает таким образом. Конечно, это не лучшее решение и имеет большой потенциал для улучшения. Но он работает. И mipmaps будут реализованы в качестве следующей функции. Я просто забыл удалить строку – glethien
Я использую ваш метод показать изображение, но я получаю нарушение доступа к чтению для использования image.ptr(). Пожалуйста, см. Мой пост здесь: https://stackoverflow.com/questions/45013214/qt-signal-slot-cvmat-unable-to-read-memory-access-violation#45014271 – Pete