OpenCV image laden für OpenGL-Textur
Möchte ich ein Bild laden (jpg und png) mit OpenCV als OpenGL-Textur.
Hier ist, wie ich das Bild laden zu 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);
}
Das Bild geladen ist, als "Bild.leer" immer false zurück
Hier ist, wie ich das Rendern der Szene mit dem erstellten textur:
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();
Und schließlich der fragmentShader wo ich will, um die textur anwenden, um meine geometrie
#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);
}
Die textur-Koordinaten sind comeing von einem Vertex-Buffer-Objekt und sind richtig eingestellt, aus dem .obj-Datei. Auch ich kann sehen, dass das Objekt in meiner Szene, wenn ich die Farbe auf z.B. rot in den fragment-shader, oder vec4(tCoord,0,1); dann das Objekt ist schattiert in verschiedenen Farben.
Leider bleibt der Bildschirm schwarz, wenn ich will, um die textur anwenden... Kann mir jemand helfen und mir sagen, warum bleibt schwarz?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur suchen Ihre textur laden von code, den Sie sind, ignorieren viele überlegungen, wie OpenCV legt die Bilder im Speicher. Ich habe bereits erklärt, dass für die entgegengesetzte Richtung (
glGetTexImage
in OpenCV Bild) in diese Antwort, aber rekapitulieren Sie hier für die CV-GL-Regie:Zunächst OpenCV nicht zwangsweise store-Bild-Reihen dicht gepackt, aber vielleicht ausrichten, dass Sie auf bestimmte byte-Grenzen (weiß nicht, wie viel, mindestens 4, aber vielleicht 8 oder mehr?). Wenn man Glück hat, wird es mit 4-byte-Ausrichtung und der GL ist eingestellt auf die Standard-pixel-Speicher-Modus der 4-byte-Ausrichtung zu. Aber es ist am besten manuell Geige mit dem pixel-Speicher-Modi, um auf der sicheren Seite:
Dann müssen Sie berücksichtigen die Tatsache, dass OpenCV speichert Bilder von oben nach unten, während die GL Verwendungen, von unten nach oben. Dies könnte gesorgt werden, indem nur die spiegelung der t-textur-Koordinate entsprechend (vielleicht direkt im shader), aber man kann auch nur klappen Sie das Bild vor dem hochladen:
Nicht zuletzt OpenCV speichert Farbbilder im BGR-format, Upload als RGB-würde verfälschen die Farben. So verwenden
GL_BGR
(OpenGL 1.2, aber wer tut das nicht?) inglTexImage2D
.Könnten diese nicht die komplette Lösung für Ihr problem (da ich denke, dass diese Fehler sollten eher das Ergebnis verzerrt, anstatt ein Schwarzes Bild), aber Sie sind auf jeden Fall Probleme zu kümmern.
EDIT: Hat Ihr fragment-shader tatsächlich erfolgreich kompiliert (in der vollständigen version mit der textur)? Ich Frage deshalb, weil in der GLSL 3.30 bist du mit dem Wort
texture
ist auch der name der builtin-Funktion (die sollte eigentlich verwendet werden, statt des veraltetentexture2D
- Funktion), also vielleicht hat der compiler einige Probleme bei der Namensauflösung (und vielleicht wird dieser Fehler ignoriert in Ihrer vereinfachten Shader, gegeben, dass die ganze uniform optimiert wird entfernt und viele GLSL-Compiler sind bekannt, etwas anderes zu sein als strikt standard-konform). Also einfach versuchen zu geben, die uniform sampler einen anderen Namen.Okay, hier ist meine funktionierende Lösung - basierend auf den Ideen von "Christan Rau" - vielen Dank dafür!