Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Mai 14, 2024 01:41

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: RenderToTexture, Alphakanal
BeitragVerfasst: Di Dez 02, 2008 01:17 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
Hi,
ich will hier in eine Textur rendern. Die wird später dem Benutzer vor die Augen als HUD vor die Nase auf einem Quad gesetzt.
So ein HUD sollte ja nun größtenteils durchsichtig sein.
Aber mein Code erzeugt partout keine Textur mit Alphakanal?
C++:

Einmal die Textur initialisieren:
Code:
  1.  
  2.     std::vector<unsigned GLbyte> buffer;
  3.     buffer.resize(width * width * 4);
  4.  
  5.     glGenTextures(1, &textureID);
  6.     glBindTexture(GL_TEXTURE_2D, textureID);
  7.  
  8.     glTexImage2D(GL_TEXTURE_2D, 0, 4, width, width, 0, GL_RGBA, GL_UNSIGNED_BYTE, &buffer[0]);
  9.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  10.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  11.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  12.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  13.     glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  14.     glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  15.  


Beginn des RenderToTexture:
Code:
  1.  
  2.     glViewport(0, 0, width, width);
  3.  
  4.     // Im Testlauf: 1.0f, 0.0f, 1.0f, 0.5f
  5.     glClearColor(clearR, clearG, clearB, clearA);
  6.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  7.  
  8.  
  9.     glMatrixMode(GL_PROJECTION);
  10.     glPushMatrix();
  11.     glLoadIdentity();
  12.     gluPerspective(60.0, 1.0, 0.1, 100.0);
  13.     glMatrixMode(GL_MODELVIEW);
  14.     glLoadIdentity();
  15.  


Ende vom RenderToTexture:
Code:
  1.  
  2.     glBindTexture(GL_TEXTURE_2D, textureID);
  3.     glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, this->width, this->width, 0);
  4.     glViewport(0, 0, width, height);
  5.     glMatrixMode(GL_PROJECTION);
  6.     glPopMatrix();
  7.     glMatrixMode(GL_MODELVIEW);
  8.  


Raus kommt eine strahlend weiße Textur? Die sollte doch (testweise ;)) Pink und halbdurchsichtig sein?
Benutze ich stattdessen nur 3 Kanäle überall ("3" statt "4" und "GL_RGB" statt "GL_RGBA" an den entsprechenden Stellen), ist die Textur wie erwartet pink, bloß halt ohne Alphakanal.
Blending ist aktiviert, das fällt als Fehlerquelle raus...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: RenderToTexture, Alphakanal
BeitragVerfasst: Di Dez 02, 2008 10:52 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Philip hat geschrieben:
Aber mein Code erzeugt partout keine Textur mit Alphakanal?

Das liegt vermutlich daran wie diese Technik arbeitet. In deinem Falle kopierst du die Daten aus dem Framebuffer. Das heißt aber, dass dein Framebuffer ZWINGEND einen Alphakanal benötigt. Denn du kannst nichts kopieren was nicht existiert. Normalerweise sollte da aber zu mindest RGB kopiert werden.

Lösen kannst du das Problem nur in dem du deinen RenderContext auch zwingend mit Alphakanal erstellst. Genau dort fängt es aber an kritisch zu werden. Teilweise werden die Kontexte aber selbst bei 32 Bit nicht mit Alphakanal erstellt. Du musst dann beim Erstellen auch wirklich angeben, dass du einen Alphakanal haben willst. Allerdings über diese Angabe können sich die Treiber hinwegsetzen. Entsprechend musst du überprüfen ob der Treiber auf dich gehört hat oder nicht. Das ganze muss beim Initialisieren passieren und basiert auf den PixelFormaten. Nähere Details spare ich mir gerade, da ich nicht weiß wie du deinen RC erstellst.

Alternativ kann ich dir aber nur die Erweiterung der FrameBuffer Objects (FBO) ans Herz legen. Damit kannst du die OpenGL Ausgabe auf eine masgeschneiderte Textur umleiten und sparst dir den ganzen Ärger mit dem RC bzw den Aufwand des nachträglichen Kopierens. Solltest du auch ganz alte Hardware/Treiber unterstützen müssen, dann wären die FBOs vermutlich nicht ganz das. Aber sonst ist das FBO eher das wozu ich dir raten würde.

PS: Außerdem benutzt du bei den Texturen MipMaps (GL_LINEAR_MIPMAP_LINEAR). Wenn du versuchst eine Textur zu benutzen die keine MipMaps besitzt aber welche benutzen soll, dann ist die Textur eigentlich nicht Gültig und wird konsequent immer weiß dargestellt. Die Filterung solltest du besonders für eine GUI auf GL_LINEAR stellen. MipMaps benötigst du so ja auch nicht. Wenn doch kannst du dir die MipMaps auch automatisch von der Grafikkarte erzeugen lassen (dazu gibt es eine Erweiterung). Wobei FBOs dort aber ein bessere Handling haben. Da gibt es einen Befehl der dann die MipMaps erstellt. (Bessere Kontrolle darüber wann es gemacht wird)

PPS: Beim Erstellen der Texturen sollte man besser keine 3 oder 4 mehr benutzen sondern direkt das interne Format angeben. (GL_RGB8 oder GL_RGBA8 etc...)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 02, 2008 15:06 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
Alles klar, vielen dank. Dann stell ich heute Abend das mal alles auf FBOs um, sieht ja nicht nach viel Arbeit aus. :)
Hoffentlich stimmt das Tutorial und es wird nur OpenGL 1.1 benötigt, weil zur Verfügung steht 1.5 ohne Shader (Der Kram wird auf verschiedene Beamer eines Caves über Chromium verteilt). :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 02, 2008 16:12 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Philip hat geschrieben:
Hoffentlich stimmt das Tutorial und es wird nur OpenGL 1.1 benötigt, weil zur Verfügung steht 1.5 ohne Shader (Der Kram wird auf verschiedene Beamer eines Caves über Chromium verteilt). :)

Hmmm. Ich sage das jetzt nur sehr ungern. Aber ich denke nicht, dass es dort funktionieren wird. OpenGL 1.1 ist sofern richtig. ABER OpenGL 1.1 + die entsprechende Erweiterung (GL_EXT_framebuffer_object). Wenn diese Erweiterung nicht unterstützt wird sieht es schlecht aus. Und diese Erweiterung ist um einiges aktueller als OpenGL 1.5. Ich meine die ist sogar etwas aktueller als OpenGL 2.0.

Leider sagt mit das System nichts wovon du da gesprochen hat. Als Alternative würden evtl auch pBuffer gehen. Das ist zwar Platformspezifisch und von der Handhabung umständlicher als FBOs aber zu mindest auch nicht ganz so neu. Für diese Technik werden entweder WGL_ARB_pbuffer oder WGL_EXT_pbuffer benötigt.

Wenn du die Möglichkeit hast solltest du erst mal überprüfen welche Funktionen dein System dort kann. Dazu gibt es unter anderem ein Tool namens glView. Damit kannst du dir anzeigen lassen welche Erweiterungen dein System kann. Das läuft aber nur auf XP. Aber dazu braucht man normal auch nur 2-3 Befehle, dann hätte man solche eine Liste auch selber.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 02, 2008 17:19 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
Oha, ok. Morgen bin ich wieder im VR-Labor und kann das da mal alles austesten. Danke.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.024s | 19 Queries | GZIP : On ]