Voglio caricare un'immagine (jpg e png) con OpenCV come Texture OpenGL.Caricamento immagine OpenCV per Texture OpenGL
Ecco come si carica l'immagine 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);
}
L'immagine viene caricata, come "image.empty" restituisce sempre false
Ecco come io rendo la scena utilizzando la texture creata :
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();
E infine il fragmentShader dove voglio applicare la texture alla mia geometria
#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);
}
Le coordinate della trama provengono da un oggetto buffer Vertex e sono impostate correttamente dal file obj. Inoltre posso vedere l'oggetto nella mia scena quando imposto il colore ad es. rosso nello shader del frammento, o in vec4 (tCoord, 0,1); quindi l'oggetto è ombreggiato in diversi colori.
Sfortunatamente lo schermo rimane nero quando voglio applicare la trama ... Qualcuno può aiutarmi e dirmi perché rimane nero?
Quindi funziona in questo modo? A proposito, perché hai cambiato il filtro e le modalità di bloccaggio? E perché generi mipmap mentre non usi un filtro mipmapping? –
Sì, sta funzionando in questo modo - Sicuramente non è la soluzione migliore e ha molte potenzialità per migliorare - Ma sta funzionando - E mipmaps sarà implementato come funzione successiva, ho appena dimenticato di rimuovere la linea – glethien
Sto usando il tuo metodo per mostrare l'immagine, ma sto ricevendo una violazione di accesso in lettura per l'utilizzo di image.ptr(). Si prega di consultare il mio post qui: https://stackoverflow.com/questions/45013214/qt-signal-slot-cvmat-unable-to-read-memory-access-violation#45014271 – Pete