Über Textur Umrandung malen



  • Hi,

    Ich habe eine Textur erstellt und auf dieser Textur will ich eine grüne Umrandung malen, siehe Code. Das funktioniert auch soweit nur das die Textur plötzlich mit Grün wird. Nur wieso?

    glGenTextures(1, &texture);
    glBindTexture( GL_TEXTURE_2D, texture );
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    
    glClearColor (0.0,0.0,0.0,1.0);
    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
    
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img.cols, img.rows,0, GL_BGR, GL_UNSIGNED_BYTE, img.data);
    glEnable( GL_TEXTURE_2D );
    
    glBegin (GL_QUADS);
    glTexCoord2d(0.0,0.0); glVertex2d(-1.0,+1.0);
    glTexCoord2d(1.0,0.0); glVertex2d(+1.0,+1.0);
    glTexCoord2d(1.0,1.0); glVertex2d(+1.0,-1.0);
    glTexCoord2d(0.0,1.0); glVertex2d(-1.0,-1.0);
    glEnd();
    
    glDisable( GL_TEXTURE_2D );
    
    glColor3f(0.0f, 1.0f, 0.0f);
    glLineWidth(3.0f);
    glBegin(GL_LINE_LOOP);
    glVertex2d(-0.999, -0.999);
    glVertex2d(+1.0, -0.999);
    glVertex2d(+1.0, +1.0);
    glVertex2d(-0.999, +1.0);
    glEnd();
    

    Mit freundlichen Grüßen
    stadl



  • Das

    glEnable(GL_TEXTURE_2D)
    

    sollte schon da stehen bevor du eine Textur generierst.
    Anstatt

    glDisable(GL_TEXTURE_2D)
    

    probier mal

    glBindTexture(GL_TEXTURE_2D, 0);
    


  • wenn ich glDisable nicht mache, dann ist die Farbe der Umrandung nicht grün sondern besitzt irgendeine Farbe.Die Textur bleibt dabei aber wieder so komisch grün, d.h. die Textur sieht dann so aus als ob eine 50% grüne transparente Schicht rübergelegt wurde. 😕
    Zur Info die Methode wird öfters aufgerufen, wenn das eine Rolle spielen sollte.

    Irgendwie färbt glColor3f(0.0f, 1.0f, 0.0f); die Textur ein. Ich dachte mit glClearColor (0.0,0.0,0.0,1.0); verhindere ich das. Wenn ich glColor3f allerdings weglasse sehe ich die Umrandung nicht mehr.

    Mit freundlichen Grüßen
    stadl



  • Grade gesehen:

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img.cols, img.rows,0, GL_BGR, GL_UNSIGNED_BYTE, img.data)
    

    Hat das einen Grund warum du als internal Format GL_RGB nimmst und dann GL_BGR als Format?
    Mach die mal gleich.
    Ansonsten kann ichs mir aus dem Code den du mir hier zeigst nicht sagen was da falsch läuft. Trotzdem sind meine Hinweise richtig. glEnable und glDisable sind hier an der falschen Stelle bzw ich würde es vermeiden das im RenderCode stehen zu haben.
    Wird btw das glTexImage auch öfters aufgerufen? Zeig das mal bitte komplett wie es aufgerufen wird. Das wirrwarr hier bringt uns nicht weiter.
    Und schreib ein

    glColor3f(1,1,1)
    

    oberhalb glBegin(GL_QUADS) mit rein.



  • Scorcher24 schrieb:

    Und schreib ein

    glColor3f(1,1,1)
    

    oberhalb glBegin(GL_QUADS) mit rein.

    Vielen Dank das war es! Allerdings verstehen tue ich das nicht warum glColor was mit der Textur zu tuen hat?

    GL_BGR und GL_RGB deswegen weil die Daten in BGR Format abgespeichert sind.
    Wie meinst du das, dass man glEnable und glDisable an der Stelle vermeiden sollte? Wo wären die besser aufgehoben? Und ja glTexImage wird öfters aufgerufen, da immer eine andere Textur geladen wird.

    Mit freundlichen Grüßen
    stadl



  • stadl schrieb:

    Scorcher24 schrieb:

    Und schreib ein

    glColor3f(1,1,1)
    

    oberhalb glBegin(GL_QUADS) mit rein.

    Vielen Dank das war es! Allerdings verstehen tue ich das nicht warum glColor was mit der Textur zu tuen hat?

    GL_BGR und GL_RGB deswegen weil die Daten in BGR Format abgespeichert sind.
    Wie meinst du das, dass man glEnable und glDisable an der Stelle vermeiden sollte? Wo wären die besser aufgehoben? Und ja glTexImage wird öfters aufgerufen, da immer eine andere Textur geladen wird.

    Mit freundlichen Grüßen
    stadl

    Naja die Farbe wird mit der Texturfarbe pro Pixel multipliziert. Hab da erst nicht dran gedacht. Deswegen finde ich mittlerweile Shader gut, da kann man das viel logischer nachvollziehen.
    Das entspricht folgendem Fragment-Shader:

    #version 330
    
    uniform sampler2D TextureID;
    
    smooth in vec4 theColor;
    smooth in vec2 theTextureCoord;
    
    out vec4 outputColor;
    
    void main()
    {
        vec4 value = texture2D(TextureID, theTextureCoord);       
    
        value = value * theColor;    
        outputColor = value;
    }
    

    Ich hoffe ich täusche mich da jetzt nicht total :D.

    Auch dein restlicher Code ist eigentlich seit 10 Jahren nicht mehr Praxis.
    glEnable und glDisable sollte man, wenn möglich, nur aufrufen wenn unbedingt nötig. Diese zwingen nämlich OpenGL dazu alle Kommandos sofort auszuführen.
    Und in dem Fall ist das glDisable total unnötig.
    Du willst ja nur, dass deine Textur nicht mehr verwendet wird. Deswegen reicht glBindTexture(GL_TEXTURE_2D, 0) völlig aus.
    das glEnable(GL_TEXTURE_2D) reicht 1x im Programm, nachdem du den OpenGL Canvas initialisiert hast.



  • ah ok verstehe.
    Den Code den du gepostest hast ist das OpenGL3.0?
    Wenn ich glDisable weglasse dann ist die Farbe der Umrandung plötzlich anders nicht mehr grün, sondern irgendeine andere Farbe die für mich nicht nachvollziehbar ist. Vielleicht multipliziert er die Umrandungsfarbe wieder mit der Textur?

    Mit freundlichen Grüßen
    stadl



  • Nein, das ist ein Fragment Shader, gehört aber zu OpenGL 3 mit der Syntax.
    Und wie gesagt, du musst statt glDisable -> glBindTexture(GL_TEXTURE_2D, 0) verwenden. Das setzt die aktuelle Textur auf 0=nichts. Dann passt das auch. glDisable deaktiviert Texturen komplett. Und das wollen wir ja nicht. Denn im nächsten Frame wirds ja wieder aktiviert.
    Ich seh btw auch nicht wo du die Textur wieder löschst.



  • ok danke funktioniert jetzt auch ohne glDisable.
    Die Textur wird im Destructor der Klasse erst gelöscht, weil ich ja immer wieder die Textur mit ein neuen Bild lade per glTexImage2D, sonst müsste ich ja im jedem Frame glGenTextures(1, &texture); aufrufen (Alles was vor glTexImage2D im Code oben steht wird nur einmal in der Initialisierung Phase aufgerufen).

    Mit freundlichen Grüßen
    stadl


Anmelden zum Antworten