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

Aktuelle Zeit: So Jul 06, 2025 00:20

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Di Jan 08, 2008 11:38 
Offline
DGL Member

Registriert: Mi Nov 28, 2007 17:37
Beiträge: 17
Wohnort: Berlin
Tag an alle hier,
erstmal Gratulation an die meiner Meinung nach sehr gut gemachten Tutorials und
eigentlich generell an die Seite hier ... :wink:
... ich hab nach längerer Zeit wieder einmal ein Problem will auch nicht lange
um den heißen Brei rumreden und komme deshalb mal gleich zum Thema.
Ich bin nun bei Tutorial 8 und habe mit dem Verständnis für folgendes ein Problem ...

Wieso sind die Konstanten im meinem unteren Beispiel als Array angegeben und wieso
verändert sich deren Eigenschaft wenn ich z.B. bei @mat_specular[0] statt der null eine
1,2 oder 3 nehme ??? :?

Ich könnte das ja verstehen wenn ich die Konstanten so deklariert hätte das mat_specular[0]
andere R,G,B,A-Werte hat als mat_specular[1] ... usw.
Also jedes Feld eines jeweiligen Arrays andere Werte zuweise damit sie bei einem Aufruf
unterschiedliche Eigenschaften aufweisen.
Für mich sieht das untere Beispiel aus wie ein Array dessen Werte alle gleich sind.
Das untere Beispiel rendert in etwa das erste Bild aus Tutorial 8. Versteht mich nicht
falsch es klappt alles Wunderbar nur ich hasse es Sachen zu machen die ich nicht verstehe.
Wenn ich sie nicht verstehe schreibe ich einfach nur ohne Sinn ab und das bringt nichts.
Also ...
Wieso ändert sich dennoch der Wert der Konstanten im Array ???


Code:
  1. procedure TForm1.Render;
  2. const  
  3.     n = 20;
  4.     radius = 1;
  5.     mat_specular   : Array[0..3] of GlFloat = (1.0, 1.0, 1.0, 1.0);
  6.     mat_shininess  : Array[0..0] of GlFloat = (50.0);
  7.     mat_ambient    : Array[0..3] of GlFloat = (0.4, 0.4, 0.4, 1.0);
  8.     mat_diffuse    : Array[0..3] of GlFloat = (0.4, 0.8, 0.4, 1.0);
  9.  
  10.     light_position : Array[0..3] of GlFloat = (10.0, 10.0, 0.0, 1.0);
  11.     light_ambient  : Array[0..3] of GlFloat = (0.8, 0.8, 0.8, 1.0);
  12.     light_diffuse  : Array[0..3] of GlFloat = (0.8, 0.8, 0.8, 1.0);
  13.  
  14. var a : integer;
  15.   begin
  16.  
  17.   glClearColor(0,0,0,0);
  18.     glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  19.     glMatrixMode (GL_PROJECTION);
  20.     glLoadIdentity;
  21.     gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  22.     glMatrixMode (GL_MODELVIEW);
  23.     glLoadIdentity;
  24.  
  25.  
  26.     glMaterialfv(GL_FRONT, GL_SPECULAR,  @mat_specular[0]);
  27.     glMaterialfv(GL_FRONT, GL_SHININESS, @mat_shininess[0]);
  28.     glMaterialfv(GL_FRONT, GL_AMBIENT,   @mat_ambient[0]);
  29.     glMaterialfv(GL_FRONT, GL_DIFFUSE,   @mat_diffuse[0]);
  30.  
  31.     glLightfv(GL_LIGHT0, GL_AMBIENT,  @light_ambient[0]);
  32.     glLightfv(GL_LIGHT0, GL_DIFFUSE,  @light_diffuse[0]);
  33.     glLightfv(GL_LIGHT0, GL_POSITION, @light_position[0]);
  34.  
  35. rS  := rS + (0.08 * DrawTime);
  36. glTranslatef (0,-3,-20);
  37. glRotatef(rS,0,1,0);
  38.  
  39.  
  40. a := 0;
  41. repeat
  42.   gluSphere(gluNewQuadric,radius,15,15);
  43.   glRotatef(360/n,0,0,1);
  44.   glTranslatef(radius,0,0);
  45.   a := a + 1;
  46. until a = n ;
  47.  
  48.  
  49. SwapBuffers(DC);
  50. end;

_________________
Es ist ein großer Vorteil im Leben, die Fehler, aus denen man
lernen kann, möglichst früh zu begehen.


Zuletzt geändert von Mastiguas am Di Jan 08, 2008 15:43, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 08, 2008 11:48 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Da du dein Array als Pointer übergibst, indiziert die 0 (oder je nach dem was du da einsetzt) dein erstes Element. Wenn du also dein komplettes Array übergeben willst, musst du dort eine 0 einsetzen. (bei einer 1 wäre dann der y wert plötzlich der x wert und der z wert der y wert, ginge man von vektoren aus)

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 08, 2008 12:06 
Offline
DGL Member

Registriert: Mi Nov 28, 2007 17:37
Beiträge: 17
Wohnort: Berlin
Boah ... öhm ...
Naja das versteh ich so nicht ganz.
Also würde das heißen bei z.B.
Code:
  1. mat_specular   : Array[0..3] of GlFloat = (1.0, 1.0, 1.0, 1.0);


zeige ich mit
Code:
  1. glMaterialfv(GL_FRONT, GL_SPECULAR,  @mat_specular[0]);

auf die ganzen Werte R,G,B,A ...
... und mit
Code:
  1. glMaterialfv(GL_FRONT, GL_SPECULAR,  @mat_specular[1]);

nur noch auf G,B,A ...
... und mit
Code:
  1. glMaterialfv(GL_FRONT, GL_SPECULAR,  @mat_specular[2]);

nur noch auf B,A ...
usw.

Oder meinst du das jetzt anders ??? :?

_________________
Es ist ein großer Vorteil im Leben, die Fehler, aus denen man
lernen kann, möglichst früh zu begehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 08, 2008 12:17 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Ja, genau das meint Seth. Das ganze ist übrigens noch schlimmer da du nicht auf G, B, A sondern auch auf den Speicherbereich hinter dem Array zeigst und somit wild im Speicher rumgelesen wird.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 08, 2008 13:27 
Offline
DGL Member

Registriert: Mi Nov 28, 2007 17:37
Beiträge: 17
Wohnort: Berlin
Klingt ja nicht gerade sehr nach Perfomance ... :D
Aber wo ließt er denn wild im Speicher rum ???
Ich seh nicht das ein Zeiger im Array auf ein nicht
belegten Platz zeigt zumal doch das Programm dann garnicht
compiliert werden müsste.
Da meckert doch Delphi dann immer ...


@mat_specular[x]

0 steht für alle Werte als "Farbmischung" nehmen. (R,G,B,A)
1 ohne Alpha Wert (R,G,B)
2 ohne blau (R,G)
... und ...
3 nur rot (R)

Halt von dem jeweiligen Konstantenwert ...
... oder ??? :(

_________________
Es ist ein großer Vorteil im Leben, die Fehler, aus denen man
lernen kann, möglichst früh zu begehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 08, 2008 13:40 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Wenn du nicht den Pointer auf das erste Element nimmst, sondern auf das Zweite, kann OpenGL das ja nicht wissen und denkt so, dass nach dem angegebenen Element im Array
noch 3 kommen. Wenn du also @mat_specular[1] angibst, nimmt OpenGL deinen G Wert intern als R Wert, und deinen B Wert als G Wert.

Wenn OpenGL dann den A Wert haben will, ist dein Array aber schon zu Ende. Das bedeutet, dass einfach die nächste Adresse im Speicher benutzt wird. Was da drin steht kann dir aber leider keiner sagen.

Kurz und knapp: OpenGL weiß nicht, ob du den Pointer an der Stelle 0, 1, 2 oder 3 benutzt hast (im Array mat_specular[x] ).
Hast du nicht die 0 genommen, nimmt OpenGL trotzdem die nächsten 3 Adressen im Speicher, die danach kommen.

Delphi meckert das nicht an, da die Funktion ja nur einen Pointer auf einen GlFloat erwartet. Der Rest passiert dann in der DLL.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 08, 2008 14:34 
Offline
DGL Member

Registriert: Mi Nov 28, 2007 17:37
Beiträge: 17
Wohnort: Berlin
Achsoooo ...
Also heißt das , dass man generell nur die 0 verwenden sollte oder
das jeweilige Array so erweitern das man 1,2,3 ... benutzen kann.
Zum Beispiel
Code:
  1. mat_ambient    : Array[0..7] of GlFloat = (0.4, 0.4, 0.4, 1.0, 0.8, 0.2, 0.2, 1.0);


Dann könnte ich doch auch ...

@mat_ambient[0]
@mat_ambient[1]
@mat_ambient[2]
@mat_ambient[3]


... angeben
Nun greift er nicht mehr einfach irgendwo in
den Speicher da das Array ja bis dahin geht.



Ist das nun richtig so oder hab ich doch noch was nicht kapiert ???

_________________
Es ist ein großer Vorteil im Leben, die Fehler, aus denen man
lernen kann, möglichst früh zu begehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 08, 2008 14:55 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Du kannst das Array natürlich so groß machen wie du das möchtest aber du solltest immer bedenken, dass glMaterialfv 4 Werte erwartet. Und die nacheinander im Speicher liegen müssen.

Wenn du jetzt allerdings [0] und [1] übergibst dann übergibst du überlappende Bereiche. Also zu erst ein mal den ersten Wert und OpenGL nimmt sich 3 Weitere die danach im Speicher lieben. Und bei [1] übergibst du den zweiten Wert und OpenGL nimmt sich noch 3 darauf folgende Werte.

Das bekommst OpenGL bei [0].
[0], [1], [2], [3], [4], [5], [6], [7]

Das bekommst OpenGL bei [1]
[0], [1], [2], [3], [4], [5], [6], [7]

Um es zu erreichen, dass sich die Bereiche nicht überlappen müsstest du also [0] und [4] übergeben. Denn [4] liegt direkt nach den ersten 4 Werten. Und du musst dann dafür sorgen, dass nach [4] noch 3 Werte liegen. Ansonsten kann es passieren, dass OpenGL auf etwas falschen zugreift oder sogar Fehler wirft.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 08, 2008 15:24 
Offline
DGL Member

Registriert: Mi Nov 28, 2007 17:37
Beiträge: 17
Wohnort: Berlin
Gut , na dann weis ich ja jetzt wie das genau funktioniert. :lol:
Ich bedanke mich bei eurer schnellen und ausführlichen Hilfe
und sag schonmal bis zum nächsten mal . :wink:

_________________
Es ist ein großer Vorteil im Leben, die Fehler, aus denen man
lernen kann, möglichst früh zu begehen.


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


Wer ist online?

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