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

Aktuelle Zeit: Mo Jul 14, 2025 18:10

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Wassertutorial - OpenGL
BeitragVerfasst: Mo Mär 12, 2012 19:20 
Offline
DGL Member

Registriert: Di Aug 09, 2011 07:33
Beiträge: 163
Programmiersprache: C/C++
Hey,

Ich habe momentan ein kleines Problem mit dem Tutorial. Nutze das aus der Wiki: http://wiki.delphigl.com/index.php/Tuto ... ssereffekt

Ich bin noch bei dem Part über dem Feintuning, also wo nur der eine Shader genutzt wird doch so wirklich klappen will es nicht. Ich kann per Uniform ohne Probleme die Mappingratio ändern usw. aber der BumpMapping Effekt will nicht so wirklich laufen.


Nutze folgende BumpMap: http://www.reindelsoftware.com/Document ... erbump.jpg
(Habe die BumpMap bei mir auf 1024x1024 drin - Refract und Reflect haben die selbe größe im FBO)

Der Shader ist von der wiki 1:1 übernommen.

Zuletzt noch der (entscheidene) C Code:
Code:
  1.     glUseProgram(ReflectionShader);
  2.     glActiveTexture(GL_TEXTURE0);
  3.     static GLuint Waterbump = loadTexture(loadBMP("game/Waterbump.bmp"), 1);
  4.  
  5.     glMatrixMode(GL_TEXTURE);
  6.     glPushMatrix();
  7.  
  8.     glTranslatef(0.5f, 0.5f, 0.0f);
  9.     glScalef(0.5f, 0.5f, 0.0f);
  10.     gluPerspective(fov, Window_x/Window_y, Clip_Near, Clip_Far);
  11.     glRotatef(-Mouse_y_calc, 1.0f, 0.0f, 0.0f);
  12.     glRotatef(-Mouse_x_calc/2 + 90, 0.0f, 0.0f, 1.0f);
  13.     glTranslatef(-Move_x, -Move_y, -Move_z);
  14.     glMatrixMode(GL_MODELVIEW);
  15.  
  16.     //Tex to Shader
  17.     glActiveTexture(GL_TEXTURE5);
  18.     glBindTexture(GL_TEXTURE_2D, Waterbump);
  19.     glUniform1i(Texture3, 5);
  20.     glActiveTexture(GL_TEXTURE4);
  21.     glBindTexture(GL_TEXTURE_2D, Refract);
  22.     glUniform1i(Texture1, 4);
  23.     glActiveTexture(GL_TEXTURE3);
  24.     glBindTexture(GL_TEXTURE_2D, Reflect);
  25.     glUniform1i(Texture2, 3);
  26.     glActiveTexture(GL_TEXTURE0);
  27.  
  28.     static float Ratio = 1.0f/2.0f;
  29.     glUniform1f(refractRatio, Ratio);
  30.     glUniform1f(reflectRation, Ratio);
  31.     glUniform1f(mappingRatio, 0.4f);
  32.     glUniform1i(extendedBlending, 0);
  33.  
  34.     glDisable(GL_BLEND);
  35.     glBindTexture(GL_TEXTURE_2D, Reflect);
  36.  
  37.     glDepthMask(GL_FALSE);
  38.     glBegin(GL_QUADS);
  39.         glTexCoord3f(-400.0, -400.0, 0.0);
  40.         glVertex3f(-400.0, -400.0, 0.0);
  41.         glTexCoord3f(-400.0, 400.0, 0.0);
  42.         glVertex3f(-400.0, 400.0, 0.0);
  43.         glTexCoord3f(400.0, 400.0, 0.0);
  44.         glVertex3f(400.0, 400.0, 0.0);
  45.         glTexCoord3f(400.0, -400.0, 0.0);
  46.         glVertex3f(400.0, -400.0, 0.0);
  47.     glEnd();
  48.  
  49.     glEnable(GL_BLEND);
  50.     glDepthMask(GL_TRUE);
  51.     glBindTexture(GL_TEXTURE_2D, Refract);
  52.     glColor4f(1.0f, 1.0f, 1.0f, 0.25f);
  53.     glBegin(GL_QUADS);
  54.     glTexCoord3f(-400.0, -400.0, 0.0);
  55.     glVertex3f(-400.0, -400.0, 0.0);
  56.     glTexCoord3f(-400.0, 400.0, 0.0);
  57.     glVertex3f(-400.0, 400.0, 0.0);
  58.     glTexCoord3f(400.0, 400.0, 0.0);
  59.     glVertex3f(400.0, 400.0, 0.0);
  60.     glTexCoord3f(400.0, -400.0, 0.0);
  61.     glVertex3f(400.0, -400.0, 0.0);
  62.     glEnd();
  63.  
  64.     glUseProgram(0);
  65.  
  66.     glBindTexture(GL_TEXTURE_2D, 0);
  67.     glMatrixMode(GL_TEXTURE);
  68.     glPopMatrix();
  69.     glMatrixMode(GL_MODELVIEW);


Code:
  1. void LoadReflectionShader()
  2. {
  3.     GLuint v, f;
  4.     char *vs = NULL, *fs = NULL;
  5.     v = glCreateShader(GL_VERTEX_SHADER);
  6.     f = glCreateShader(GL_FRAGMENT_SHADER);
  7.  
  8.     vs = textFileRead("game/Shader/Reflection.vert");
  9.     fs = textFileRead("game/Shader/Reflection.frag");
  10.  
  11.     const char * vv = vs;
  12.     const char * ff = fs;
  13.  
  14.     glShaderSource(v, 1, &vv,NULL);
  15.     glShaderSource(f, 1, &ff,NULL);
  16.  
  17.     delete vs;
  18.     delete fs;
  19.  
  20.     glCompileShader(v);
  21.     glCompileShader(f);
  22.     ReflectionShader = glCreateProgram();
  23.  
  24.     glAttachShader(ReflectionShader, v);
  25.     glAttachShader(ReflectionShader, f);
  26.     glLinkProgram(ReflectionShader);
  27.     glUseProgram(ReflectionShader);
  28.  
  29.     Texture1 = glGetUniformLocation(ReflectionShader, "refractTex");
  30.     Texture2 = glGetUniformLocation(ReflectionShader, "reflectTex");
  31.     Texture3 = glGetUniformLocation(ReflectionShader, "bumpMap");
  32.  
  33.     refractRatio = glGetUniformLocation(ReflectionShader, "refractRatio");
  34.     reflectRation = glGetUniformLocation(ReflectionShader, "reflectRation");
  35.     mappingRatio = glGetUniformLocation(ReflectionShader, "mappingRatio");
  36.     extendedBlending = glGetUniformLocation(ReflectionShader, "extendedBlending");
  37. };



Ist zwar etwas Code aber ich hoffe es schaut sich mal jemand an.

Die Texturen an sich sind im FBO und schauen definitiv korrekt aus. Im Anhang ist auch nochmal ein Bild, wie es aktuell ausschaut.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Zuletzt geändert von AMD am Mo Mär 12, 2012 20:41, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Wassertutorial - OpenGL
BeitragVerfasst: Mo Mär 12, 2012 20:14 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Es hilft schon öfters wenn man das ganze mal sauber programmiert...

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Wassertutorial - OpenGL
BeitragVerfasst: Mo Mär 12, 2012 20:24 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Warum genau bindest du Reflect/Refract an GL_TEXTURE0 und an jeweils noch eine andere Texturunit?

Oh und bitte: Nutze doch [code=c] bzw [code=c++].

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Wassertutorial - OpenGL
BeitragVerfasst: Mo Mär 12, 2012 20:41 
Offline
DGL Member

Registriert: Di Aug 09, 2011 07:33
Beiträge: 163
Programmiersprache: C/C++
@yunharla: Das kommt noch, aber wenn man nur am rumprobieren ist und ständig was ändert, da ist solch ein Code besser...

@Lord Horazont: Na wie soll ich die Texture denn sonst an den Shader übergeben? Muss man das nicht mit verschiedenen Textureunits machen?
Wie würden denn die Zeilen dann deiner Meinung nach aussehen?

Wusste nicht, dass es beim Codesyntax C bzw. C++ gibt, merk es mir für die Zukunft.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Wassertutorial - OpenGL
BeitragVerfasst: Mo Mär 12, 2012 21:16 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
AMD hat geschrieben:
@yunharla: Das kommt noch, aber wenn man nur am rumprobieren ist und ständig was ändert, da ist solch ein Code besser...


Nein denn sonst kommen zum eigentlichen Fehler noch zusätzliche Fehler durch dirty Code (bei solchen low-level Sprachen, noch häufiger) und du sitzt schlicht und einfach sehr viel länger
an einer Sache. Bring deinen Code in eine saubere Form und ich garantier dir das du erst einmal den Kopf 3 Minuten gegen die Wand schlägst weil du den Fehler übersehen hast ;)

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Wassertutorial - OpenGL
BeitragVerfasst: Mo Mär 12, 2012 21:19 
Offline
DGL Member

Registriert: Di Aug 09, 2011 07:33
Beiträge: 163
Programmiersprache: C/C++
Heißt im Umkehrschluss: Du hast den Fehler gesehen und willst ihn mir nicht sagen? :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Wassertutorial - OpenGL
BeitragVerfasst: Mo Mär 12, 2012 22:59 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Ich glaube was Lord Horazont meinte, war dass du in Zeile 24 "Reflect" an GL_TEXTURE3 bindest und in Zeile 35 an GL_TEXTURE0. Und mit "Refract" das selbe.

Zu dem Fehler: Kann es sein das die Texturkoordinaten für die Bumpmaptextur fehlen? Bin mir jetzt nicht so sicher ob glTexCoord auch die anderen Koordinaten verändert. Ansonsten müsste man glMultiTexCoord verwenden.
Zum Debuggen kannst du auch mal "gl_FragColor = offsetColor;" an den Shader hängen, dann müsstest du deine Bumpmap sehen. Wenn dann eine einheitlich gefärbte Fläche rauskommt, stimmt offenbar der Offset durch die Bumpmap nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Wassertutorial - OpenGL
BeitragVerfasst: Mo Mär 12, 2012 23:55 
Offline
DGL Member

Registriert: Di Aug 09, 2011 07:33
Beiträge: 163
Programmiersprache: C/C++
Also wenn ich nur die Bumpmap darstellen will (offsetColor), dann ist die komplette Wasserfläche blau. Aber wirklich komplett blau (Aus RGB-Sicht: 0, 0, 1).

Ich habe mal bei glFragColor direkt das eingefügt: gl_FragColor = texture2D(bumpMap, vec2(gl_TexCoord[0]));
Dann sehe ich die BumpMap.

Wie man sieht, habe ich gl_TexCoord[1] auf [0] geändert und dann sehe ich schon ein Ergebnis was eher hinhaut!
Daher habe ich mal folgende Zeile genutzt:
vec4 offsetColor = texture2D(bumpMap, vec2(gl_TexCoord[0]));

Dadurch sehe ich schon eher ein Ergebnis aber so ganz ist es das auch noch nicht :?

Edit// Im Anhang nochmal ein Bild. Man sieht zwar schon was aber bei Dingend die "tiefer" im Wasser sind erfolgt der Effekt nicht.


Edit2// Ich glaube ich weiss was yunharla meinte :D
Ich hatte bei mir im Code reflectRation statt reflectRatio - daher auch falsches uniform übergeben und es kam dort kein Wert an :D

Edit3// Anhang vom Edit1 wurde mal gelöscht - Problem wurde ja gelöst.
Habe allerdings mal 2 weitere Bilder geuploaded wo ich noch ein letztes Problem hätte. Bei dem Pic "water2" befinde ich mich 0,5m über der Waterplane, bei "Water3" hingegen lediglich 3 Meter höher und der Effekt geht schon langsam gegen Null. Gibts denn noch eine einfache Möglichkeit, dass der Effekt nicht so stark nachlässt? Man klebt ja nicht immer auf Wasserhöhe


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Wassertutorial - OpenGL
BeitragVerfasst: Di Mär 13, 2012 10:03 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Naja da sind noch ein paar andere Dinge die alles andere als Toll sind (hoffe jetzt einfach mal die hast du auch gefixt).
Was den Effekt an sich angeht, da gibt es nur zwei Möglichkeiten:
-du veränderst die Amplitude (z.B. uniform)
-du veränderst die Frequenz (z.B. Normalmap)

Das ganze muss global gemacht werden (also nicht pro Pixel) da es sonst schlicht und einfach falsch aussehen würde.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Wassertutorial - OpenGL
BeitragVerfasst: Di Mär 13, 2012 10:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Einfach die Texturkoordinaten der Normalmap hochskalieren. Oder noch eine Detailmap dazublenden.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Wassertutorial - OpenGL
BeitragVerfasst: Di Mär 13, 2012 10:56 
Offline
DGL Member

Registriert: Di Aug 09, 2011 07:33
Beiträge: 163
Programmiersprache: C/C++
@yunharla: Ich hatte dann eben deinen Rat befolgt und den Code ordentlich geschrieben - und siehe da, mir ist der Fehler dadurch tatsächlich ins Auge gesprungen :)

@yunharla & Lord Horazont: Werde die Dinge mal probieren und schauen was am besten klappen wird, danke für die Hilfe :)


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 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.010s | 14 Queries | GZIP : On ]