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

Aktuelle Zeit: So Aug 10, 2025 01:55

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



Ein neues Thema erstellen Auf das Thema antworten  [ 43 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 14, 2005 15:49 
Offline
DGL Member

Registriert: Mo Aug 15, 2005 11:45
Beiträge: 29
Wohnort: Neuenkirchen
Hallo,

ich habe noch eine weitere Frage zu diesem Thema.
Es ist ja so, dass hier bislang eine Menge Vorschläge kamen um ein Bild bzw. den Fensterinhalt per Hauptprogramm und mit OpenGl Befehlen in eine Datei (BMP etc.) zu speichern. Gibt es denn auch eine Möglichkeit dies direkt aus dem Shader zu machen. Also nachdem er mir ein bestimmtes Bild umgewandelt hat dieses dann auch direkt als neues Bild/Textur abzulegen, die er dann im nächsten Durchgang wieder aus dem Speicher lesen kann o.ä. ?

Mfg

Sebastian


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 14, 2005 17:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Joahr. Mitm PBuffer. Den kannst du als Textur benutzen. Und dann ist er auch im Shader drin. Also du renderst mitm Shader ne Fläche in den PBuffer und den Buffer kannste dann auf ne andere Fläche anwenden die nen neuen Shader benutz. Das sollte es gewesen sein. Mit FrameBufferObjects geht das wohl noch kompfortabler und schneller. Ist allerdings neuer und wird noch nicht von allem unterstützt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 15, 2005 11:29 
Offline
DGL Member

Registriert: Mo Aug 15, 2005 11:45
Beiträge: 29
Wohnort: Neuenkirchen
Mmmh, aber wie kann ich denn im Shader mit GLSL in den PBuffer rendern ? Das ist mir leider noch nicht so ganz klar...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 15, 2005 11:50 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Der PBuffer ist im übertragenen Sinne auch nur ein Fenster. Ein Virtuelles. Dieses bekommt einen DC und einen RC. Den musst du aktivieren und alles was du dann renderst wird darein gepackt. So einfach ist das.

Aber dazu gibt es auf unserer Seite auch ein Tutorial zum Thema PBuffer. Das sollte dort auch alles enthalten sein.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 16, 2005 15:50 
Offline
DGL Member

Registriert: Mo Aug 15, 2005 11:45
Beiträge: 29
Wohnort: Neuenkirchen
Hallo,

ich stehe immer noch mit meinem Professor zusammen auf dem Schlauch. Villeicht könnt ihr mir ja doch noch helfen...

Ich hole noch mal ein wenig aus und fasse zusammen, was wir vorhaben:

1.) Es soll ein Bild in Form einer Texture geladen werden (das klappt auch schon)

2.) Dieses soll dann in Form vom Shader verändert werden und in einem Fenster gerendert werden (das klappt auch)

3.) Anschliessend soll das Bild / Textur aus dem Fenster in eine neue Textur geschrieben werden oder gespeichert werden, damit man diese dann ein weiteres mal mit dem Shader bearbeiten lassen kann (das klappt leider noch nicht)

Wir haben uns schon soviel angesehen: glReadPixel / glCopyRexImage / Pbuffer (Render to Texute)

Aber bislang haben wir noch nicht so wirklich Erfolg gehabt ! :(

Info: Programm geschrieben in C++ und Shadersprache GLSL

Wäre echt super wenn sich noch einer meiner/unser annehmen würde....

Mfg & schönes Wochenende

Sebastian


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Sep 17, 2005 13:03 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
hast du dir schon die tutorials zu copytotexture und pbuffer hier auf delphigl angesen? sind zwar delphi, aber das sollte bei ogl sachen ja kein hinderniss sein. Wenn ja, kannst du deine fragestellung ein bisschen spezifizieren, wo das prbolem liegt? so können wir nur raten.
btw: im fall von glcopyteximage2d lieber glcopysubteximage2d benutzen, da schneller (die textur muss aber einmal mit einer version ohne sub initialisiert werden)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 18, 2005 13:24 
Offline
DGL Member

Registriert: Mo Aug 15, 2005 11:45
Beiträge: 29
Wohnort: Neuenkirchen
Mal ne ganz dumme Frage: Wo finde ich diese Tutorials denn bzw. welche sollen das denn sein ?

Wenn ich mir die Tutorials angesehen habe, versuche ich mein Problem nochmal zu konkretisieren. Mein letzter Post ist ein wenig unter Zeitdruck "entstanden" ! ;) Kann mir schon vorstellen, dass man das nicht so recht versteht. Ich will auch nicht ausschliessen, dass ich mich einfach ein wenig dumm anstelle. Aber ich stehe im Moment ein wenig mit diesem ganzen "Open GL Kram" auf dem Kriegsfuss - aber das wird wohl noch.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 18, 2005 13:38 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Shader sind für den Einstieg in OpenGL auch nicht die beste Wahl ;) Aber duhast da wohl wenig alternativen, oder?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 18, 2005 13:50 
Offline
DGL Member

Registriert: Mo Aug 15, 2005 11:45
Beiträge: 29
Wohnort: Neuenkirchen
Naja was heisst Alternativen. Bei einer anderen Lösung ist ja davon auszugehen, dass diese nicht so schnell ist, oder ? Also wenn ich auf die Shader verzichte. Wobei die Shader mir ja nicht zwingend das Problem bereiten sonder mehr der Rest.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 18, 2005 15:06 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
tutorials:
glcopyteximage2d und pixelbuffer


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 21, 2005 18:01 
Offline
DGL Member

Registriert: Mo Aug 15, 2005 11:45
Beiträge: 29
Wohnort: Neuenkirchen
Hallo,

ich habe nun mal was gebastelt auf das es nun gilt aufzubauen:


Code:
  1.  
  2. void renderScene(void) {
  3.  
  4.    glMatrixMode(GL_PROJECTION);
  5.    glLoadIdentity();
  6.    glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
  7.  
  8.    makeCheckImage();
  9.    makeCheckImage2();
  10.  
  11.     glActiveTexture(GL_TEXTURE1);
  12.     glEnable(GL_TEXTURE_2D);
  13.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  14.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  15.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  16.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  17.     glTexImage2D(GL_TEXTURE_2D, 0, 3, checkImageWidth, checkImageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, &checkImage[0][0][0]);
  18.     glBindTexture(GL_TEXTURE_2D, 1);
  19.     glDisable(GL_TEXTURE_2D);
  20.  
  21.     glActiveTexture(GL_TEXTURE2);
  22.     glEnable(GL_TEXTURE_2D);
  23.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  24.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  25.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  26.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  27.     glTexImage2D(GL_TEXTURE_2D, 0, 3, checkImageWidth2, checkImageHeight2, 0, GL_RGB, GL_UNSIGNED_BYTE, &checkImage2[0][0][0]);
  28.     glBindTexture(GL_TEXTURE_2D, 2);
  29.     glDisable(GL_TEXTURE_2D);
  30.  
  31.     glUniform1iARB(glGetUniformLocationARB(p, "textur1"), 1);
  32.     glUniform1iARB(glGetUniformLocationARB(p, "textur2"), 2);
  33.  
  34.     glBegin(GL_QUADS);
  35.                   glMultiTexCoord2f(GL_TEXTURE1, 0.0, 0.0);
  36.       glMultiTexCoord2f(GL_TEXTURE2, 0.0, 0.0);
  37.       glVertex3f(0.0, 0.0, 0.0);
  38.  
  39.                   glMultiTexCoord2f(GL_TEXTURE1, 0.0, 1.0);
  40.       glMultiTexCoord2f(GL_TEXTURE2, 0.0, 1.0);
  41.       glVertex3f(0.0, 1.0, 0.0);
  42.  
  43.                   glMultiTexCoord2f(GL_TEXTURE1, 1.0, 1.0);
  44.       glMultiTexCoord2f(GL_TEXTURE2, 1.0, 1.0);
  45.       glVertex3f(1.0, 1.0, 0.0);
  46.  
  47.       glMultiTexCoord2f(GL_TEXTURE1, 1.0, 0.0);
  48.       glMultiTexCoord2f(GL_TEXTURE2, 1.0, 0.0);
  49.       glVertex3f(1.0, 0.0, 0.0);
  50.     glEnd();
  51.    
  52.     glutSwapBuffers();
  53. }


Mit makeCheckImage() & makeCheckImage2() werden einfach zwei unterschiedliche Schachbrettmuster generiert und in einen reservierten Speicher geschrieben. Ich hoffe das ist verständlich.
Mich würde nun interessieren, ob der obere Bereich von glActiveTexture(GL_TEXTURE1); bis glDisable(GL_TEXTURE_2D); soweit richtig ist, oder was falsch ist bzw. was man noch verbessern könnte. Die beiden so entstandenen Texturen werden dann im Shader überlagert, wobei das ja erstmal egal ist was die Shader machen, oder ? ;)

Als nächstes könnte man doch nun mit glReadPixel den Fensterinhalt auslesen und wieder an eine Textur übergeben mit der man dann weiter arbeiten kann, oder ?

Nun der Code ist sicherlich nicht die beste Lösung aber für mich immerhin schomal ein anfang. Es müsste doch hier dann auch was mit "glCopyTexImage2D() " oder "glCopyTexSubImage2D()" machbar sein, oder ? Nur weiss ich leider nicht wie ich das dann an eine neue Textur binde.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 21, 2005 19:35 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
readpixel solltest du definitiv vermeiden. die pixel auf die cpu zurückzulesen um sie wieder an die graka zu übergeben ist nicht so furchtbar performant..
Prinzipiel erstellst du wie üblich mit glgentexture die textur, bindest sie mit glbindtexture und rufst dann glcopyteximage auf, wie normalerweise glteximage.

zum code: du weißt schon, dass die texturunits bei 0 anfangen und nicht bei 1? und zur erstellung solltest du lieber glgentextures benutzen und die nummer in einer variable speichern, da sonst nicht absolut sichergestellt ist, dass die nummern nicht noch anderweitig benutzt werden.
und glBindtexture muss vor dem setzen der texparameter und dem glteximage für diese textur aufgerufen werden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 22, 2005 12:55 
Offline
DGL Member

Registriert: Mo Aug 15, 2005 11:45
Beiträge: 29
Wohnort: Neuenkirchen
Hallo,

ja das stimmt schon, dass ist nun angenehmer. Das mit dem glgentextures() kannte ich noch gar nicht ;) So ist also sichergestellt das mit den IDs nichts mehr schief geht, richtig ?
Zu dem glReadPixels muss ich auch sagen, dass es mit glcopyteximage() ja genau so "einfach" ist und wenn das schneller ist nehme ich lieber das. Danke !

Wie ist das denn mit den glEnable und glDisable ? Wann muss das denn gemacht werden ? Oder reicht es, wenn ich einmal glEnable(GL_TEXTURE_2D) mit reinnehme ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 22, 2005 14:27 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
glenable/disable wirkt sich immer auf das aktive texturunit (also das über glactivetexture zuletzt festgelegte) aus und bleibt für dieses solange aktiv bis es wieder disabled wird, unabhängig davon, wie andere texturunits enabled/disabled werden.

für noch höhere geschwindigkeit würde sich wohl glcopysubteximage anbieten. dafür muss dann einmal über glteximage die größe der textur festgelegt werden und dann der inhalt jeweils mit glsubteximage kopiert werden. sollte ansich von vorneherein schneller sein und hat den vorteil, dass man keine 2er potenz in jeder dimension für den viewport brauch, sondern die übrigen teil der textur dann halt einfach schwarz lässt.
Ansonsten bietet sich halt noch der pbuffer an, bei dem direkt in die textur gerendert wird.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 22, 2005 14:36 
Offline
DGL Member

Registriert: Mo Aug 15, 2005 11:45
Beiträge: 29
Wohnort: Neuenkirchen
Also ich habe festgestellt, dass das enablen und disablen z.T. keinerlei Auswirkungen hat. Sollte man sich dennoch angewöhnen dies zu machen ?
Das mit dem "Sub" werde ich nochmal ausprobieren und sehen was es gibt. Der Vorteil gegenüber glReadPixels ist aber jetzt schon gewaltig.

Das mit dem PBuffer lass ich nun lieber erstmal sein. Das habe ich versucht zu verstehen und bin - nennen wir es mal kläglich - gescheitert ;)
Ich bin so schon ganz zufrieden und mittlerweile in der Lage die Schritte mehr oder weniger gut verständlich nachzuvollziehen.

Nun muss ich mich mal ein wenig mit Cellular Automata auseinanderesetzen um so ein paar nette Beispiele zu erstellen um später dann auch die Simulation von Wärmeletungen darzustellen....


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 43 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 21 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.009s | 14 Queries | GZIP : On ]