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

Aktuelle Zeit: So Jul 20, 2025 10:48

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Di Feb 23, 2010 18:09 
Offline
DGL Member

Registriert: Fr Jan 16, 2009 13:36
Beiträge: 75
Hallo alle zusammen,

Ich möchte in meinem kleinen Progrämmchen ein Bumpmapping verwenden. Mein Cubemapping auf eine Kugel mit Hilfe von LossyX glBitmap funktioniert einwandfrei. Und jetzt kommt mein Problem. Laut Tutorial kann ich mit der glBitmap auch eine Normalmap erstellen. Dies habe ich auch mal getan und diese auf die selbe Weise eingebunden, wie zuvor meine CubeMap. Funktioniert soweit wunderbar. Ich sehe eine Normal Map auf meiner Kugel. Um diese für meine eigentlichen Texturen (6 an der Zahl) zu berechnen muss man ja, soweit ich das gelesen habe bestimmte Tools verwenden, oder selber schreiben. Da kommt schon meine ersten Fragen:

1. Wie erstelle ich eine Normalmap aus meinen Texturen (Ich habe nicht ganz verstanden wie diese normalisierten Vektoren aus meinem vorherigen Bild zu erhalten sind)
2. Wie binde ich diese Texturen (Normalmap und Cubemap) ein um Sie später im Shader verwenden zu können,


Vielen Dank schonmal an Euch!!!

Heavenssake007


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Feb 23, 2010 18:46 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

1. entweder du machst das mit der glBitmap wie du das ja schon bei der anderen gemacht hast (kannst sie ja auch wieder als datei speichern wenn du willst), oder du besorgst dir die passenden Plugins für die Bildbearbeitungsproggs. Oder willst du es wirklich selbst berechnen?

2. dazu bindest du einfach die 2 Texturen und sagst dem Shader über ein uniform welche erbenutzen soll:
im Progg:
Code:
  1.   glActiveTexture(GL_TEXTURE0); Tex.Bind;
  2.   glActiveTexture(GL_TEXTURE1); NormalMap.Bind;

im Shader:
Code:
  1. uniform sampler2D Texture0;
  2. uniform sampler2D Texture1;

Ich hab ma noch meinen BumpMapShader mit ran gehangen, der arbeitet bis auf ein kleinen Schönheitsfehler ganz gut...

MfG Bergmann.


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

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Feb 23, 2010 22:20 
Offline
DGL Member

Registriert: Fr Jan 16, 2009 13:36
Beiträge: 75
Wow,

danke fuer die schnelle Antwort. Werde das gleich mal ausprobieren. Ja ich wollte es wirklich selbst rechnen, da die Texturen im Programm dynamisch erstellt werden.

Heavenssake007


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 24, 2010 07:03 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

dann sollte dsa doch totzdem mit der glBitmap gehen... Und nochwas zum Shader. wenn man das Licht bezüglich zum Objekt dreht funzt. Aber wenn man das Objekt bezüglich zum Licht drehet, dann verschiebt sich der Schatten bzw. die Lichtquelle um 45°. Wenn du ne Lsg für das Problem hast sag me bescheid, würd mich freun...

MfG Bergmann

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 24, 2010 08:51 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
vielleicht liegt der Fehler an dieser Zeile:

Code:
  1. vec3 normal = (normalize(vec3(texture2D(Texture1, TexCoord)) + vec3(-0.5, -0.5, -0.5)));


du rechnest da (-0.5,-0.5,-0.5) auf den nicht normalisierten Vektor und normalisierst erst hinterher. Probier es doch einmal aus, ob der Shader ohne die (mmn merkwürdigen) Rotationen auskommt, wenn du die Zeile so schreibst:

Code:
  1. vec3 normal = normalize(vec3(texture2D(Texture1, TexCoord))) + vec3(-0.5, -0.5, -0.5);

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 24, 2010 09:53 
Offline
DGL Member

Registriert: Fr Jan 16, 2009 13:36
Beiträge: 75
Hallo Sellmann, hallo Bergmann,

Also ich hab die Texturen jetzt mal gebunden. die sind jetzt beide übereinandergelagert auf der Kugel. Ist der Shader aus sehe
ich dies auch eindeutig.
Sobald ich den Shader einschalte ist die Kugel schwarz. Das Licht ist enabled, die Position des Lichtes angegeben.
Beide Codefragmente sehen so aus:

Code:
  1.  
  2. procedure Render;
  3. var gObj : PGLUQuadric;
  4. begin
  5.     glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  6.     glMatrixMode(GL_PROJECTION);
  7.     glLoadIdentity;
  8.     gluPerspective(45.0, Imgage.Width/Image.Height, NearClipping, FarClipping);
  9.  
  10.     glTranslatef(0, 0, -5);
  11.  
  12.     glRotatef(FRotx,1,0,0);
  13.     glRotatef(FRoty,0,1,0);
  14.  
  15.     gObj := gluNewQuadric;
  16.  
  17.  
  18.     //glEnable(GL_TEXTURE_CUBE_MAP);
  19.     glActiveTexture(GL_Texture0);FCubeMap.Bind(true);
  20.     glActiveTexture(GL_TEXTURE1);FNormalMap.Bind();
  21.  
  22.     gluQuadricDrawStyle(gObj,GLU_FILL);
  23.     //gluQuadricTexture(gObj,true);
  24.     gluSphere(gObj,1,64,64);
  25.  
  26.     //glBindTexture(GL_TEXTURE_CUBE_MAP,FCubeMap.ID);
  27.  
  28.     SwapBuffers(DC);
  29. end;
  30.  


Code:
  1.  
  2. procedure LightOn;
  3. const mat_specular   : Array[0..3] of GlFloat = (1.0, 1.0, 1.0, 1.0);
  4.       mat_shininess  : Array[0..0] of GlFloat = (50.0);
  5.       mat_ambient    : Array[0..3] of GlFloat = (0.4, 0.4, 0.4, 1.0);
  6.       mat_diffuse    : Array[0..3] of GlFloat = (0.4, 0.8, 0.4, 1.0);
  7.  
  8.       light_position : Array[0..3] of GlFloat = (10.0, 10.0, 0.0, 1.0);
  9.       light_ambient  : Array[0..3] of GlFloat = (0.8, 0.8, 0.8, 1.0);
  10.       light_diffuse  : Array[0..3] of GlFloat = (0.8, 0.8, 0.8, 1.0);
  11.  
  12. begin
  13.   {
  14.    glMaterialfv(GL_FRONT, GL_SPECULAR,  @mat_specular[0]);
  15.    glMaterialfv(GL_FRONT, GL_SHININESS, @mat_shininess[0]);
  16.    glMaterialfv(GL_FRONT, GL_AMBIENT,   @mat_ambient[0]);
  17.    glMaterialfv(GL_FRONT, GL_DIFFUSE,   @mat_diffuse[0]); }
  18.  
  19.    glLightfv(GL_LIGHT0, GL_AMBIENT,  @light_ambient[0]);
  20.    glLightfv(GL_LIGHT0, GL_DIFFUSE,  @light_diffuse[0]);
  21.    glLightfv(GL_LIGHT0, GL_POSITION, @light_position[0]);
  22.  
  23.    glEnable(GL_COLOR_MATERIAL);
  24.    glEnable(GL_LIGHTING);
  25.    glEnable(GL_LIGHT0);
  26.  
  27. end;
  28.  


:(

Heavenssake007


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Feb 26, 2010 01:57 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

@heavenssake007: Hast dus schonma ihne Shader, und nur mit licht probiert? Und wo bzw. wie aktivierst du den Shader?
Was mir aber aufgafallen ist (aber nichts mit dem eigentlichen Problem zu tun hat) ist, das du in jedem Renderdurchgang ein neues Quadric erstellst (gluNewQuadric). Wenn du mal den Speicherverbrauch deines Programms im Auge behälst sollte das immer mehr werden und irgendwann is dann voll...

@Sellmann: Das -0.5 muss mit normalisiert werden (habs probiert). Das legt daran, die Farbwerte nur positiv sind, aber die Position des Lichts auch negativ sein kann. Die Werte liegen zwischen (0,0,0) und (1,1,1). Nach der Subtraktio zwischen (-0.5, -0.5, -0.5) und (0.5, 0.5, 0.5). Jetz sollter der Vektor bereits die richtige Richtung haben, kann aber noch länger oder kürzer als 1 sein. Also muss ich noch normalisieren.
Hab grad festgestellt, das es an der Rotation liegt. Die Funktion arbeitet nicht richtig bzw. überhaupt nicht. Hat jmd ne ordentliche Funktion zur Rotation eines Punktes/Vektors um eine beliebige Achse?

€: Hab grad noch bisl dran rum gebastelt. Jetzt is schonma die Verschiebung um 45° weg. Das einzige was ich nich hin bekomm is, dass das Licht nicht wandert, wenn ich die Kamera drehe. Normalerweiße sollte ja das Licht gleich bleiben, und nur der Glanz zuzusagen in die entgegengesetzte Richtung laufen. Ich hab ma ne Demo gemacht, da kann man den Unterschied zwischen PerPixelLight- und BumpmapShader gut erkennen. (RMT = Licht drehen, LMT = Kamera drehen)
Sry für die Parts, aber der VPN-Server von unserer FH is schon wieder down, un da komm ich net auf mien WebSpace -.-

€2: ICH HABS, FREU!!!! So hab ichs gemacht:
Code:
  1. vec3 normal *= gl_NormalMatrix; //aus dem
  2. vec3 normal = gl_NormalMatrix * normal; //wurde das

anscheint hat da die 1.0 gefehlt, weil N ja nur vec3 is oder so kp. Aber jetzt funzt er 1a. Würd mich freun wenn wir den auch in die ShaderSammlung übernehmen können (da hab ich mich dann auch im wiki verewigt :P ) Hab ma die Anhänge von oben durch die aktuellen ersetzt...
@heavenssake007: Ich hab noch ne (Teil-)Antwort auf deine Frage zwecks Texturen selbst machen. Wenn du den Vektor bzw. die Normale dann aus dem Bild errechnet Hast kannst du die so in ne Farbe umwandeln: (Vector+1)/2 vorrausgesetzt, das der Wertebereich der Werte im Vektor zwischen -1 und 1 liegt...


MfG Bergmann


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

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Feb 26, 2010 08:51 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
Stimmt, das mit der Normalisierung leuchtet ein. Das mit dem glNormalMatrix * Normal aber auch :). Ich hatte hier irgendwo auch einen Bumpmapping-Shader gepostet, da fehlte aber noch die Berechnung für Tangente und Bitangente, worraufhin dann von Coolcat der Ansatz mit dem Gradienten der Textur vorgeschlagen wurde. Warum mein Shader auch ohne Tangente und Bitangente funktionierte lag wohl daran, dass ich nur Würfel damit beleuchtet hab, deren Normalen immer genau senkrecht auf der beleuchteten Ebene standen.

Also ab damit in die Shader-Sammlung (wobei man evtl. noch das AttenuationModel aus dem Phong-Shader mit einarbeiten könnte, damit das Licht nicht unendlich weit leuchtet).

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Feb 26, 2010 11:24 
Offline
DGL Member

Registriert: Fr Jan 16, 2009 13:36
Beiträge: 75
@Bergmann Der Shader wird bei mir in einer Start Shader Procedure ausgeführt. Der Shader Startet bei einem ButtonClick. Ich hab mich dabei an den Aufruf aus dem Tutorial gehalten. Für einen Blur Shader hatte das schonmal funktioniert.

So sieht der Source Code dazu aus:

Code:
  1.  
  2. procedure TForm1.StartShader;
  3. var FragmentList,VertexList : TStringList;
  4.     FragmentLength,VertexLength : integer;
  5.     index                       : integer;
  6.     VCode,FCode                 : string;
  7.     errorcode                   : string;
  8. begin
  9.    glLoadIdentity();
  10.    ProgramObject        := glCreateProgramObjectARB;
  11.  
  12.    FragmentList := TStringList.Create;
  13.    VertexList   := TStringList.Create;
  14.  
  15.    FragmentList.LoadFromFile('FragmentShader.txt');
  16.    VertexList.LoadFromFile('VertexShader.txt');
  17.  
  18.    VCode := VertexList.Text;
  19.    FCode := FragmentList.Text;
  20.  
  21.  
  22.    FragmentLength := length(FCode);
  23.    VertexLength   := length(VCode);
  24.  
  25.    //Erstellung des Vertex und Fragment-Shaders
  26.    VertexShaderObject   := glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
  27.    FragmentShaderObject := glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
  28.  
  29.    //Sources aus StringList Laden
  30.    glShaderSourceARB(VertexShaderObject, 1, @VCode, @VertexLength);
  31.    glShaderSourceARB(FragmentShaderObject, 1, @FCode, @FragmentLength);
  32.  
  33.  
  34.    //Compilieren der Shader
  35.    glCompileShaderARB(VertexShaderObject);
  36.    glCompileShaderARB(FragmentShaderObject);
  37.  
  38.    //Log zur Fehlererkennung
  39.    errorcode := glSlang_GetInfoLog(VertexShaderObject);
  40.    if length(errorcode)>0 then
  41.    begin
  42.       showmessage(errorcode);
  43.    end;
  44.  
  45.    errorcode := glSlang_GetInfoLog(FragmentShaderObject);
  46.    if length(errorcode)>0 then
  47.    begin
  48.       showmessage(errorcode);
  49.    end;
  50.  
  51.    //Anfügen an ProgrammObjekt
  52.    glAttachObjectARB(ProgramObject, VertexShaderObject);
  53.    glAttachObjectARB(ProgramObject, FragmentShaderObject);
  54.  
  55.    //Shaderobjekte wieder freigeben
  56.    glDeleteObjectARB(VertexShaderObject);
  57.    glDeleteObjectARB(FragmentShaderObject);
  58.  
  59.    //Linken des Shaders an Programmobjekt
  60.    glLinkProgramARB(ProgramObject);
  61.  
  62.    glUseProgramObjectARB(ProgramObject);
  63.  
  64.    FragmentList.Free;
  65.    VertexList.Free;
  66.    glLoadIdentity();
  67. end;
  68.  


:( Werde mir mal deinen Source Code anschauen. Vielen Dank dafür!!!


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Feb 26, 2010 17:24 
Offline
DGL Member

Registriert: Fr Jan 16, 2009 13:36
Beiträge: 75
Hallo Bergmann,

sage mal ist es zu dreist zu fragen, ob Du mir die Unit glShader geben könntest. Ich weiss nicht so wirklich, was ich beim einbinden falsch mache.
Mir ist klar, dass, wenn ich meinen Shader nur auf ein Objekt anwenden möchte den Shader einbinden, bzw. wieder entbinden muss. Habe ich jedoch nur ein Objekt (Kugel in meinem Fall)
im Bild kann dieser doch auch die ganze Zeit anbleiben, oder?

Heavenssake007


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Feb 26, 2010 18:27 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
Wie groß ist dein Projekt den i9nsgesamt? Kannst du es evtl. mal packen und hier anhängen? Dann würde ich mir das mal anschauen und gucken ob ich den Fehler finde. Natürlich sag ich dir dann bescheid, wenn ich da was entdeckt habe.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Feb 26, 2010 18:42 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

@Sellmann: meintest du den Thread? ^^ Sascha hat mich vorhin freigeschalten, da mach ich mich dann ma daran den Artikel zu schreiben. Das mit den Phong Shader guck ich mir nochma an, aber so schwer klingt das nich...

@heavenssake007: Fragen kostet nix ^^ die Unit is im Anhang. Hab ma noch schnell paar Kommentare rein geschrieben. Wenn der Shader auf alle Objekte angewendet werden soll kann man den an lassen, ja. Versuchs ma mit der Unit, wenns dann nich geht suchmer wo anders. Wenns geht vergleich den Code mal, wo der Fehler is.

MfG Bergmann


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

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mär 02, 2010 18:11 
Offline
DGL Member

Registriert: Fr Jan 16, 2009 13:36
Beiträge: 75
Hallo Sellmann und Bergmann,

Ich habe das Projekt mal gepackt und zuvor noch ein wenig kommentiert. Bei der 2d-Textur mit Shader läuft alles wunderbar. Nehme ich die Cubemap und schalte den Shader an, ist alles schwarz. :(
Vielleicht habt Ihr ja eine Idee, woran das liegen mag. Ich danke Euch schon einmal sehr für Eure Hilfe!!!

Heavenssake007


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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Mär 03, 2010 00:18 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

du hast zwar eine NormalMap erstellt, aber die is leer. Die Methode GenerateNormalMap() erzeugt aus der aktuell geladen Textur eine NormalMap. Da aber keine geladen wurde ist alles schwarz. Und eine schwarze NormalMap reflektiert kein Licht ;)
Du must also zu deiner CubeMap eine CubeNormalMap erstellen. Da die glBitmap diese Fkt nicht mitliefert musst du dir die Texturen selbst generieren, und dann als CubeMap laden und Binden, dann sollte das gehen...

€: Hab das grad ma ausprobiert, daran liegts auch nich. Ich denk ma der Shader kommt mit der CubeMap nich klar. Da musst du dir wohl die Mühe machen un die Sachen die OpenGL normalerweiße allein macht selber im Shader realisieren. Der Artikel über CubeMaps im Wiki sollte dir dabei helfen.

Hab auch ma mein TestProjekt angehängt. Wenn du jetzt den Shader noch anpasst, dann sollte es so funktionieren. Mal nebenbei, wozu brauchst du das? CubeMaps nimmt man doch normalerweße für Spielgelung an Objekten, oder? Und die zu Bumpmappen wäre ja sinnlos, weil das reflektierende Objekt ja dann die Stuktur annimmt?!

MfG Bergmann.


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

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Mär 05, 2010 13:42 
Offline
DGL Member

Registriert: Fr Jan 16, 2009 13:36
Beiträge: 75
Hallo Bergmann,

Danke für die Hilfe, bin jetzt durch Deine/Eure Hilfe schon entscheidend weitergekommen. Sollte mir die Shaderanpassung für die Cubemaps gelingen, so stelle ich diese hier rein.

Viele Grüsse

Heavenssake007


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]