OpenGL Polygon Uebergaenge

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
adapto
Beiträge: 24
Registriert: 22.07.2012, 01:12
Alter Benutzername: adapto

OpenGL Polygon Uebergaenge

Beitrag von adapto »

Hallo *,

wenn ich zwei Polygone in OpenGL mit verschiedenen Farben zeichne und diese in eine Textur rendere wird an der Kante zwischen den beien geglaettet bzw OpenGL erzeugt an manchen Stellen einen Farbuebergang (siehe Bild), obwohl ich folgende Bedingungen gesetzt habe:

Code: Alles auswählen

glShadeModel(GL_FLAT); 
glDisable(GL_LIGHTING);
glDisable(GL_MULTISAMPLE);
glDisable(GL_BLEND);
glDisable(GL_ALPHA_TEST);
Hat jemand eine Idee wie ich das deaktivieren kann?

Danke und Gruss,
adapto
Dateianhänge
info.png
info.png (2.87 KiB) 3853 mal betrachtet
Youka
Beiträge: 28
Registriert: 20.04.2011, 18:24
Wohnort: Darmstadt

Re: OpenGL Polygon Uebergaenge

Beitrag von Youka »

Du meinst das Anti-aliasing über Multisampling, welches du mit glDisable(GL_MULTISAMPLE) deaktivieren möchtest.
Leider lässt sich über diesen Weg automatisches Multisampling nicht deaktivieren, da dein Kontext mit dieser Eigenschaft erstellt wurde und darauf beharrt.

Du könntest deinen Kontext ohne Multisampling erstellen oder über FBOs ohne Multisampling auf die Textur rendern.
adapto
Beiträge: 24
Registriert: 22.07.2012, 01:12
Alter Benutzername: adapto

Re: OpenGL Polygon Uebergaenge

Beitrag von adapto »

Ich erzeuge einen eigenen Framebuffer und dann schalte ich das Multisampling aus. Also bevor ich in die Textur rendere mache ich folgendes:

Code: Alles auswählen

glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, Width, Height, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);

glGenRenderbuffers(1, &dbo);
glBindRenderbuffer(GL_RENDERBUFFER, dbo);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, Width, Height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, dbo);

glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
und danach schalte ich den angegebenen Rest aus.

Danke.

P.s.: Der Context ist auch ohne Multisampling initialisiert:

Code: Alles auswählen

glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
Youka
Beiträge: 28
Registriert: 20.04.2011, 18:24
Wohnort: Darmstadt

Re: OpenGL Polygon Uebergaenge

Beitrag von Youka »

Dann würde ich meinen, dieser Farbverlauf auf deinem Bild im ersten Post entsteht beim Zeichnen deiner Textur auf ein Objekt, wobei die Textur mit einem bilinearen Filter skaliert wird.
Schau dir mal glTexParameter, darunter den Bereich GL_TEXTURE_MIN_FILTER, an.
adapto
Beiträge: 24
Registriert: 22.07.2012, 01:12
Alter Benutzername: adapto

Re: OpenGL Polygon Uebergaenge

Beitrag von adapto »

Ich benutze hier keine Texturen sondern koloriere nur die Polygone.
PlainOldCJ
Beiträge: 11
Registriert: 03.12.2012, 20:56
Echter Name: Christian

Re: OpenGL Polygon Uebergaenge

Beitrag von PlainOldCJ »

Hi,

was Youka meinte ist glaube ich folgendes:
Mit

Code: Alles auswählen

glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0);
zeichnest du in eine Textur.
Wie zeichnest du dann den Inhalt dieser Textur auf den Bildschirm?
adapto
Beiträge: 24
Registriert: 22.07.2012, 01:12
Alter Benutzername: adapto

Re: OpenGL Polygon Uebergaenge

Beitrag von adapto »

Achso... Ich speichere die Textur vorerst in eine Datei und schaue sie mir in Photoshop an :)

Aber kann es sein, das dabei dann etwas nicht stimmt:

Code: Alles auswählen

glReadPixels(0, 0,Width, Height, GL_RGB, GL_UNSIGNED_BYTE, pRGB);
adapto
Beiträge: 24
Registriert: 22.07.2012, 01:12
Alter Benutzername: adapto

Re: OpenGL Polygon Uebergaenge

Beitrag von adapto »

Youka hat geschrieben:Dann würde ich meinen, dieser Farbverlauf auf deinem Bild im ersten Post entsteht beim Zeichnen deiner Textur auf ein Objekt, wobei die Textur mit einem bilinearen Filter skaliert wird.
Schau dir mal glTexParameter, darunter den Bereich GL_TEXTURE_MIN_FILTER, an.
Ok. Ich habe GL_TEXTURE_MIN_FILTER und GL_TEXTURE_MAG_FILTER auf GL_NEAREST gesetzt, aber es aendert sich leider auch hierbei nichts. Ich aendere die Texturgroesse nicht, sondern speichere sie direkt in eine Datei um diesen Fehler auszuschliessen.
joeydee
Establishment
Beiträge: 1058
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: OpenGL Polygon Uebergaenge

Beitrag von joeydee »

Versuch mal Antialiasing über den Treiber komplett auszuschalten, ob es das Problem trifft.
Und vielleicht ist hier noch was dabei:
glHint(GL_POLYGON_SMOOTH_HINT, GL_FASTEST);
glDisable(GL_POLYGON_SMOOTH);//schaltet das erstere glaube ich sowieso aus, OGL ist lange her...

Versuch auch mal probehalber was mit Lines passiert (und den entsprechenden GL_LINES-Einstellungen)
adapto
Beiträge: 24
Registriert: 22.07.2012, 01:12
Alter Benutzername: adapto

Re: OpenGL Polygon Uebergaenge

Beitrag von adapto »

Also bei dem ATI Treiber ist Aliasing auf "use application settings" eingestellt.

Mit glHint konnte ich auch keine Aenderung herbeifuehren. Wenn ich mit GL_LINES arbeite habe ich genau das gleiche Problem.

Danke.
joeydee
Establishment
Beiträge: 1058
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: OpenGL Polygon Uebergaenge

Beitrag von joeydee »

Das heißt also, eine einzelne Linie wird auch immer mit AA gezeichnet? Wie siehts auf dem Bildschirm aus, also ohne die gespeicherte Textur, ist AA an oder aus (manueller Screenshot)? Oder taucht das erst auf der Textur auf? Kannst du probehalber AA über den Treiber zwingend deaktivieren - wie siehts dann aus? Dann weißt du wenigstens ob du in der richtigen Richtung suchst.
adapto
Beiträge: 24
Registriert: 22.07.2012, 01:12
Alter Benutzername: adapto

Re: OpenGL Polygon Uebergaenge

Beitrag von adapto »

Ich habe das Problem jetzt lange verdraengt weil ich noch was anderes programmieren musste, aber jetzt stehe ich wieder davor und komme nicht weiter. Also bei dem AMD Control Center kann man nur auf "Use Application Settings" setzen, man kann das nicht direkt ausschalten. Und wenn ich direkt in den Bildschirm rendere, dann passt das Bild nicht da rein da die aufloesung so gross ist. Das Bild wird dann herunterskaliert.
adapto
Beiträge: 24
Registriert: 22.07.2012, 01:12
Alter Benutzername: adapto

Re: OpenGL Polygon Uebergaenge

Beitrag von adapto »

Und jetzt etwas ganz Verruecktes! Wenn man die Rendertextur von RGB auf RGBA umstellt, dann funktioniert es so wie gewollt. Hat vielleicht jemand eine Erklaerung dafuer?
Antworten