OpenCV chargement de l'image de Texture OpenGL
Je veux charger une image (jpg et png) avec OpenCV comme Texture OpenGL.
Ici est de savoir comment je charge l'image pour l'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'image est chargée, en tant que "image.vide" renvoie toujours false
Ici est de savoir comment je le rendu de la scène à l'aide à la création de la texture:
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();
Et enfin la fragmentShader où je veux appliquer la texture de ma géométrie
#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);
}
Les coordonnées de texture sont comeing à partir d'un Vertex Buffer Object et sont correctement configurés à partir de l' .fichier obj. Aussi, je peux voir l'Objet dans ma scène lorsque j'ai mis la couleur, par exemple rouge dans le fragment shader, ou à vec4(tCoord,0,1); ensuite, l'objet est à l'ombre dans une couleur différente.
Malheureusement, l'écran reste noir quand je veux appliquer la texture... quelqu'un Peut-il m'aider et me dire pourquoi reste noir?
OriginalL'auteur glethien | 2013-05-29
Vous devez vous connecter pour publier un commentaire.
À partir de seulement chercher à votre texture de chargement de code vous passez à côté de beaucoup de considérations sur la façon d'OpenCV énonce les images en mémoire. Je l'ai déjà expliqué que, pour la direction opposée (
glGetTexImage
dans OpenCV image) dans cette réponse, mais pour récapituler ici pour le CV-GL direction:Tout d'abord OpenCV ne représentent pas forcément l'image du magasin rangs serrés, mais sont susceptibles de correspondre à certaines limites d'octets (je ne sais pas combien, au moins 4, mais peut-être 8 ou plus?). Si vous avez de la chance, il va utiliser les 4 octets de l'alignement et de la GL est la valeur par défaut de pixel mode de stockage de 4 octets de l'alignement, de trop. Mais il est préférable d'manuellement violon avec le pixel modes de stockage, pour être sur le côté sécuritaire:
Ensuite, vous devez tenir compte du fait que OpenCV stocke des images, de haut en bas, tandis que le GL utilise du bas vers le haut. Cela pourrait être pris en charge par juste la mise en miroir de la t-coordonnées de texture de la manière appropriée (peut-être directement dans le shader), mais vous pourriez tout aussi bien renverser l'image avant de les télécharger:
Dernier mais pas moins OpenCV stocke des images en couleur dans BGR format de téléchargement comme RVB auraient pour effet de fausser les couleurs. Donc, utiliser
GL_BGR
(requiert OpenGL 1.2, mais qui ne l'a pas?) dansglTexImage2D
.Ces pourrait ne pas être la solution à votre problème (car je pense que ces erreurs sont plutôt le résultat déformé plutôt qu'une image noire), mais ils sont certainement des problèmes pour prendre soin de.
EDIT: votre fragment shader compiler avec succès (dans la version complète à l'aide de la texture)? Je demande parce que, dans le GLSL 3.30 vous utilisez le mot
texture
est aussi le nom d'une fonction builtin (qui devrait en fait être utilisé à la place de l'obsolètetexture2D
fonction), alors peut-être que le compilateur a quelques problèmes de résolution de nom (et peut-être que cette erreur est ignorée dans votre simplifié shaders, étant donné que l'ensemble de l'uniforme sera optimisé loin et beaucoup de GLSL compilateurs sont connus pour être autre chose que ce qui est strictement conforme à la norme). Donc, juste essayer de donner que de l'échantillonneur de l'uniforme d'un nom différent.OriginalL'auteur Christian Rau
Ok, voici ma solution de travail basé sur les idées de "Christan Rau" - Merci pour cette!
Oui, c'est travailler de cette façon - Sûrement pas la meilleure solution et a beaucoup de potentiel pour améliorer - Mais c'est de travailler Et de mipmaps seront mis en œuvre dans le prochain long métrage, j'ai juste oublié de supprimer la ligne
Je suis en utilisant votre méthode pour afficher une image, mais je suis une violation d'accès en lecture pour l'utilisation de l'image.ptr(). Veuillez voir mon post ici: stackoverflow.com/questions/45013214/...
OriginalL'auteur glethien