ok ..
es lag ah Blending
der Alphawert hat die Farben verfälscht.
mit glDisable(GL_BLEND); funktioniert es.
Mein gott was das zeit kostet , so kelinigkeiten.
aber ich kann den Alphawert nicht rausbekommen mit glReadPixels(x,y,1,1,GL_ALPHA,GL_UNSIGNED_BYTE,@VBOCoord[3]);
da bekomm ich immer 255, obwohl der apfawert 100 ist. es macht keinen unterschied ob GL_BLEND an oder aus ist .
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Hast du eine NVidia Grafikkarte? Die sind nämlich so geil und lassen den Alphakanal einfach weg sobald der nicht explizit mit angegeben wurde. Selbst dann wenn man 32 Bit Farbtiefe angegeben hat. Dann bleiben halt 8 Bit ungenutzt. Warum auch immer NVidia so etwas irrsinniges macht.
Du müsstest dann beim Erstellen des RCs in der PixelFormat Description das Feld cAlphaBits explizit auf 8 setzen.
Allerdings denke ich, dass es wohl besser wäre wenn du selber einen RC erstellst. Also nicht mit Hilfe der Methoden CreateRenderingContext. Denn der erstellte Kontext muss sich nicht zwingend daran halten was du von ohm möchtest. Denn sobald du 16 Bit Farbtiefe im System hast hat der RC auch nur 16 Bit Farbtiefe. Auf ATI bekommt man noch zusätzlich einen 8 Bit Alphakanal wenn man das möchte aber trotzdem haben die RGB Werte nur 16 Bit. Somit bekommst du keine Sinnvollen Ergebnisse mehr.
Das müsstest du abfangen und den Dienst verweigern oder speziell darauf reagieren. In der Methode CreateRenderingContext steht der Befehle DescribePixelFormat. Mit diesem wird das Format befragt wie dessen Eigenschaften aussehen. Dort enthalten ist das Feld cColorBits bzw. cRedBits, cGreenBits, cBlueBits, cAlphaBits. Für den einfachen Weg genügt es, wenn du überprüfst ob 32 Bit Farbtiefe auch zurückgegeben wurde. Evtl auch noch ob alle entsprechenden Felder 8 Bit haben. Und sollte dies nicht der Fall sein so müsste deine Anwendung abbrechen und die Ausführung verweigern.
Ja .. ich hab ne NVidia.
Die Theorie hab ich verstanden .. hab mir auch mal die Funktion createRenderingContext angeschaut. und ich üwsste nicht wie ich den Alpha kanal aktiviere oder ich mir die funktion selbst schreibe..
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also generell sieht der Aufbau so aus.
- PixelFormatDescriptor (PFDescriptor) befüllen
- Ein passendes Pixelformat auswählen (ChoosePixelFormat)
- das ausgewählte Pixelformat dem DeviceContext (DC) zuweisen (SetPixelFormat)
- OpenGL RenderContext (RC) erstellen.
Wenn du einfach nur 8 Bit Alpha hinzufügen willst dann genügt es folgendes zu tun.
Code:
cColorBits := ColorBits;
if ColorBits =32then// <<< NEU
cAlphaBits :=8;// <<< NEU
Und sonst kann ich dur nur Empfehlen. Schau dir die Methode in dem OpenGL 2.1 Header (Ohne .NET) an. Dort habe ich die Methode schon etwas ausfegräumt gehabt.
Zum Überprüfen ob du auch 32 Bit RGBA kannst du den PixelFormatDescriptor nach dem Aufruf von DescribePixelFormat auf seine Gültiggeit untersuchen.
Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.