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

Aktuelle Zeit: Sa Jul 05, 2025 01:57

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Textur
BeitragVerfasst: Fr Jan 03, 2003 14:28 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 03, 2003 14:15
Beiträge: 36
Hallo NG,

ich bin neu in diesem Forum und beschäftige mich seit einiger Zeit mit OPenGL - mit mehr oder weniger Erfolg.

Hier der Quellcode meines Programms:

Code:
  1.  
  2.  
  3. //*******************************************************************
  4.  
  5.  procedure DrawScene;
  6.  
  7.    const ambient     : array[0..3] of GLFloat=(0.3,0.3,0.3,1);
  8.  
  9.          position1   : array[0..3] of GLFloat=(0.0,0.2,1.0,1);
  10.  
  11.          position2   : array[0..3] of GLFloat=(0.0,-0.2,1.0,1);
  12.  
  13.          direction1  : array[0..2] of GLFLoat=(0.0,0.0,-1.0);
  14.  
  15.          direction2  : array[0..2] of GLFLoat=(0.0,0.0,1.0);
  16.  
  17.          MatAMbient  : array[0..3] of GLFloat=(0.0,0.2,0.6,1.0);
  18.  
  19.          MatEmission : array[0..3] of GLFloat=(0.3,0.3,0.9,1.0);
  20.  
  21.  
  22.  
  23.    var lauf1    : integer;
  24.  
  25.        lauf2    : integer;
  26.  
  27.        lauf3    : integer;
  28.  
  29.        lauf4    : integer;
  30.  
  31.        lauf5    : integer;
  32.  
  33.        lauf6    : integer;
  34.  
  35.        lauf7    : integer;
  36.  
  37.        lauf8    : integer;
  38.  
  39.        lwd      : array[0..1] of glfloat;
  40.  
  41.        wdt      : glfloat;
  42.  
  43.        step     : glfloat;
  44.  
  45.        norm     : TPoint;
  46.  
  47.        Area     : TArea;
  48.  
  49.        logo     : boolean;
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  begin
  56.  
  57.  
  58.  
  59.     texture1 := auxDIBImageLoadA('granit.bmp');
  60.  
  61.     if not Assigned( texture1 ) then begin
  62.  
  63.       MessageBox(0,'Texturenpfad oder Dateiname falsch!'+#13+' Bitte den Pfad überprüfen!','Fehler beim Laden der Textur!',MB_OK or MB_ICONERROR);
  64.  
  65.     end;
  66.  
  67.     glGenTextures(1, tex);
  68.  
  69.     glBindTexture(GL_TEXTURE_2D, tex);
  70.  
  71.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  72.  
  73.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  74.  
  75.     glTexImage2D(GL_TEXTURE_2D, 0, 3, texture1^.sizeX, texture1^.sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, texture1^.data);
  76.  
  77.     glbindtexture(GL_Texture_2D,tex);
  78.  
  79.     logo:=true;
  80.  
  81.  
  82.  
  83.     glviewport(0,0,ebene.width,Ebene.height);
  84.  
  85.     glClearColor(0.6,0.6,0.6,1);
  86.  
  87.     glclear(GL_color_buffer_bit or gl_depth_buffer_bit);
  88.  
  89.     glenable(gl_texture);
  90.  
  91.     glMatrixMode(GL_PROJECTION);
  92.  
  93.  
  94.  
  95.     glEnable(GL_LIGHTING);
  96.  
  97.     glLightModelfv(GL_LIGHT_MODEL_AMBIENT,@Ambient);
  98.  
  99.     glLightModelf(GL_LIGHT_MODEL_TWO_SIDE,0.0);
  100.  
  101.     glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER,1.0);
  102.  
  103.  
  104.  
  105.     glMaterialfv(GL_FRONT, GL_AMBIENT, @MatAmbient);
  106.  
  107.     glMaterialfv(GL_FRONT, GL_EMISSION,@MatEmission);
  108.  
  109.     glMaterialf(GL_FRONT, GL_SHININESS, 50);
  110.  
  111.     glEnable(GL_LIGHT0);
  112.  
  113.     glEnable(GL_LIGHT1);
  114.  
  115.  
  116.  
  117.     glLightfv(GL_LIGHT0,GL_AMBIENT,@Ambient);
  118.  
  119.     glLightfv(GL_LIGHT0,GL_POSITION,@Position1);
  120.  
  121.     glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,@Direction1);
  122.  
  123.     glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,90);
  124.  
  125.     glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,10);
  126.  
  127.  
  128.  
  129.     glLightfv(GL_LIGHT1,GL_AMBIENT,@Ambient);
  130.  
  131.     glLightfv(GL_LIGHT1,GL_POSITION,@Position2);
  132.  
  133.     glLightfv(GL_LIGHT1,GL_SPOT_DIRECTION,@Direction2);
  134.  
  135.     glLightf(GL_LIGHT1,GL_SPOT_CUTOFF,90);
  136.  
  137.     glLightf(GL_LIGHT1,GL_SPOT_EXPONENT,10);
  138.  
  139.  
  140.  
  141.     glgetfloatv(gl_line_width_range,@lwd);
  142.  
  143.     glgetfloatv(gl_line_width_granularity,@step);
  144.  
  145.     gllinewidth(lwd[1]/4);
  146.  
  147.  
  148.  
  149.  
  150.  
  151.     glbegin(gl_line_strip);
  152.  
  153.     glFrontFace(GL_CW);
  154.  
  155.     glcolor3f(1,1,1);
  156.  
  157.     glvertex3f(0,-0.2,0);
  158.  
  159.     glvertex3f(0,0.2,0);
  160.  
  161.     glend;
  162.  
  163.  
  164.  
  165.     glbegin(gl_line_strip);
  166.  
  167.     glFrontFace(GL_CW);
  168.  
  169.     glcolor3f(1,1,1);
  170.  
  171.     glvertex3f(-0.2,0,0);
  172.  
  173.     glvertex3f(0.2,0,0);
  174.  
  175.     glend;
  176.  
  177.  
  178.  
  179.     glbegin(gl_line_strip);
  180.  
  181.     glFrontFace(GL_CW);
  182.  
  183.     glcolor3f(1,1,1);
  184.  
  185.     glvertex3f(0,0,-0.2);
  186.  
  187.     glvertex3f(0,0,0.2);
  188.  
  189.     glend;
  190.  
  191.  
  192.  
  193.     glbegin(gl_triangle_strip);
  194.  
  195.     glFrontFace(GL_CW);
  196.  
  197.     glTexCoord2f(0,0);glvertex3f(d3x[1],d3y[1],d3z[1]);
  198.  
  199.     lauf7:=0;              
  200.  
  201.     lauf8:=BLINDEX[2];  
  202.  
  203.  
  204.  
  205.     for lauf1:=1 to BLMAX-1 do
  206.  
  207.       begin
  208.  
  209.         lauf3:=BLINDEX[lauf1];    
  210.  
  211.         lauf4:=BLINDEX[lauf1+1];  
  212.  
  213.         lauf5:=1;                
  214.  
  215.         lauf6:=0;                
  216.  
  217.         for lauf2:=2 to max(BLINDEX[lauf1],BLINDEX[lauf1+1]) do
  218.  
  219.           begin
  220.  
  221.             lauf5:=lauf5+1;
  222.  
  223.             if lauf5>lauf3 then
  224.  
  225.               lauf5:=lauf3;
  226.  
  227.  
  228.  
  229.             lauf6:=lauf6+1;
  230.  
  231.             if lauf6>lauf4 then
  232.  
  233.               lauf6:=lauf4;
  234.  
  235.  
  236.  
  237.             gltexcoord(1/1);glvertex3f(d3x[lauf8+lauf6],d3y[lauf8+lauf6],d3z[lauf8+lauf6]);  
  238.  
  239.             gltexcoord(0/0);glvertex3f(d3x[lauf7+lauf5],d3y[lauf7+lauf5],d3z[lauf7+lauf5]);  
  240.  
  241.             if logo then
  242.  
  243.               begin
  244.  
  245.                 Area[1][1]:=d3x[lauf7+1];
  246.  
  247.                 Area[1][2]:=d3y[lauf7+1];
  248.  
  249.                 Area[1][3]:=d3z[lauf7+1];
  250.  
  251.  
  252.  
  253.                 Area[2][1]:=d3x[lauf7+lauf5];
  254.  
  255.                 Area[2][2]:=d3y[lauf7+lauf5];
  256.  
  257.                 Area[2][3]:=d3z[lauf7+lauf5];
  258.  
  259.  
  260.  
  261.                 Area[3][1]:=d3x[lauf8+lauf6];
  262.  
  263.                 Area[3][2]:=d3y[lauf8+lauf6];
  264.  
  265.                 Area[3][3]:=d3z[lauf8+lauf6];
  266.  
  267.                 logo:=false;
  268.  
  269.               end else begin
  270.  
  271.                 Area[3][1]:=d3x[lauf8+lauf6-1];
  272.  
  273.                 Area[3][2]:=d3y[lauf8+lauf6-1];
  274.  
  275.                 Area[3][3]:=d3z[lauf8+lauf6-1];
  276.  
  277.  
  278.  
  279.                 Area[2][1]:=d3x[lauf7+lauf5];
  280.  
  281.                 Area[2][2]:=d3y[lauf7+lauf5];
  282.  
  283.                 Area[2][3]:=d3z[lauf7+lauf5];
  284.  
  285.  
  286.  
  287.                 Area[3][1]:=d3x[lauf8+lauf6];
  288.  
  289.                 Area[3][2]:=d3y[lauf8+lauf6];
  290.  
  291.                 Area[3][3]:=d3z[lauf8+lauf6];
  292.  
  293.               end;
  294.  
  295.             norm:=GetNormal(Area);
  296.  
  297.             glnormal3f(norm[1],norm[2],norm[3]);
  298.  
  299.           end;
  300.  
  301.         glend;
  302.  
  303.         glbegin(gl_line_strip);
  304.  
  305.         glFrontFace(GL_CCW);
  306.  
  307.         gllinewidth(lwd[1]/2);
  308.  
  309.         glcolor3f(1.0,0.0,0.0);
  310.  
  311.         glvertex3f(d3x[lauf7+1],d3y[lauf7+1],d3z[lauf7+1]);
  312.  
  313.         glvertex3f(ax[lauf7+1],ay[lauf7+1],d3z[lauf7+1]);
  314.  
  315.         glcolor3f(0.5,0.5,0.0);
  316.  
  317.         glvertex3f(E3X[lauf8],E3Y[lauf8],E3Z[lauf8]);
  318.  
  319.         glend;
  320.  
  321.  
  322.  
  323.         glbegin(gl_triangle_strip);
  324.  
  325.         glFrontFace(GL_CW);
  326.  
  327.         lauf8:=lauf8+BLINDEX[lauf1+1];
  328.  
  329.         lauf7:=lauf7+BLINDEX[lauf1];
  330.  
  331.         logo:=true;
  332.  
  333.         glTexCoord2f(0,0);glvertex3f(d3x[lauf7+1],d3y[lauf7+1],d3z[lauf7+1]);
  334.  
  335.       end;
  336.  
  337.     glend;
  338.  
  339.  
  340.  
  341.     swapbuffers(DC);
  342.  
  343.  
  344.  
  345.   end;
  346.  
  347. //*******************************************************************
  348.  
  349.  


Die Szene erscheint auch sauber auf dem Bildschirm - in hellblau. Von der Textur ist nichts zu sehen. Die 3D-Punkte liegen in dem D3X.. Arrays und laufen von oben nach unten. Ich taste mit einem Laser eine Wand ab und möchte diese dann darstellen. Für die Konstruktion der Dreiecke gehe ich wie folgt vor:

Aus der ersten Abtastreihe nehme ich en ersten Punkt und dann den ersten Punkt aus der zweiten Abtastreihe. Mit dem zweiten Punkt aus der ersten Abtastreihe mache ich dann das erste Dreieck. Dann hole ich mir immer den nächsten Punkt etc.

Das Problem nun: die Textur erscheint gar nicht. Die Linien, die ich im zweiten Schritt einziehe und eigentlich hinter der Wand sein sollen (Arrays AX.. E3X..) scheinen durch die Wand durch. Meine zweite Lichtquelle erscheint auch gar nicht. Kann mir jemand helfen ?

Danke und Gruß


Markus :cry: :cry:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 03, 2003 14:48 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
<span style='color:red'>Ich erwähns hier mal : Wenn ihr größere Quellcodes oder Programme posten wollt, dann bitte nicht ins Posting, sondern besser auf DGLs-FTP-Server hochladen!</span>

Zitat:
Von der Textur ist nichts zu sehen


Was mir direkt auffällt ist folgendes :
Code:
  1. glenable(gl_texture);

Damit aktivierst du eindimensionales Texturemapping.Das wird heute kaum jemand nutzen, und ist auch für das was du machst völlig unbrauchar.
Du musst mit glenable(gl_texture_2d); das zweidimensionale Texturemapping aktivieren.

In diesem Zusammenhang ist folgendes auch falsch :
Code:
  1. gltexcoord(1/1);

Damit generierst du nämlich eindimensionale Texturenkoordinaten.Das kann auch nicht funktionieren.Hier solltest du die Funktion glTexCoord2f(S,T) benutzen, die Texturkoordinaten für das zweidimensionale Texturemapping setzt.

Zitat:
Die Linien, die ich im zweiten Schritt einziehe und eigentlich hinter der Wand sein sollen (Arrays AX.. E3X..) scheinen durch die Wand durch

Das liegt daran, das du den Tiefentest nicht aktiviert hast.Das geht unter OpenGL so :
Code:
  1.  
  2.  
  3. glEnable(GL_DEPTH_TEST);
  4.  
  5. glDepthFunc(GL_LESS);
  6.  
  7.  

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 03, 2003 15:14 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 03, 2003 14:15
Beiträge: 36
Hallo SOS,

vielen Dank für Deine Antwort - sorry für das große Code Posting :oops:

Also: ich habe den Code geändert. Alles ist nach wie vor blau, die Textur fehlt immer noch und mene zweite Lampe läuft auch nicht. :cry: :cry: :cry:

Obwohl ich die Linien in einer anderen Farbe zeichne, erscheinen sie einfach nicht in meiner Farbe. Alles ist hellblau ....

Kannst Du mir helfen ?


Gruß


Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 03, 2003 15:23 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Zitat:
Obwohl ich die Linien in einer anderen Farbe zeichne, erscheinen sie einfach nicht in meiner Farbe. Alles ist hellblau ....


Hm...ist deine Textur vielleicht hellblau?Wenn ja, dann liegt das daran.Wenn du nämlich mit glColor3f(1,1,1) dir Farbe deiner Linien auf Weiß setzen tust, und vorher eine Textur gebunden hast, dann wird diese mit voller Intensität (also so wie sie sein soll) gezeichnet.
Deaktivier deshalb mal, bevor du deine Linien zeichnest das Texturemapping mit glDisable(GL_TEXTURE_2D) und aktiviere es wieder bevor du die mit einer Textur zu "beklebende" Fläche wieder zeichnest per glEnable(GL_TEXTURE_2D).

Das sollte zumindest dein Problem mit den Farben lösen.

Was deine Textur und dein zweites Licht angeht : Lad mal dein komplettes Programm irgendwo hoch (am besten auf dem FTP-Server von DGL->siehe Files-Sektion)...dann werd ich mir das Programm mal herunterladen und mir den Quellcode in aller Ruhe ansehen.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 03, 2003 15:47 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 03, 2003 14:15
Beiträge: 36
Hallöchen,


ich habs gerade per E-Mail rüber genudelt. Die Textur sieht eigentlich aus wie ein Stein - grau mit einem Muster. Ich habe aber auch noch andere Texturen - z.B. ne Oberfläche die die Venus darstellen soll. Die wäre rot usw. wird aber auch blau.


Gruss


Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 04, 2003 13:47 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
So.Ich hab mir dein Programm mal angesehen.Ich hoffe du kannst mit der Wahrheit umgehen :twisted: ...

Dein OpenGL-Programm ist so stark fehlerverseucht, das ich dir zwei Dinge ans Herz lege : Lies dir ein paar gute Eisnteigertuts durch, und zieh dir unbedingt mal das Redbook.Das klärt viele Fragen und hilft auch bei der Fehlersuche.

Dinge die mir u.a. aufgefallen sind :

<span style='color:green'>Alle Linien bzw. Oberflächen erscheinen bläulich :</span>
Ds liegt daran, das deine Material-Emissionsfarbe und dein Material-Ambientwert blau sind (0.3,0.3,0.9,1.0 bzw. 0,0.2,0.6,1.0).Wenn du unverfälschte Farben willst, dann benutze den Parameter nicht, oder setz ihn gleichmäßig (z.B. 0.5, 0.5, 0.5, 1).
Wenn du diese Parameter (deren Bedeutung im RedBook nachlesbar ist) nicht brauchst, dann kommentier folgende Zeilen aus :
Code:
  1.  
  2.  
  3. glMaterialfv(GL_FRONT, GL_AMBIENT, @MatAmbient);
  4.  
  5. glMaterialfv(GL_FRONT, GL_EMISSION,@MatEmission);
  6.  
  7.  


<span style='color:green'>Fehlerhafte Normalen :</span>
So wie die Sache aussieht, sind deine Normalen nicht richtig kalkuliert, weshalb dein Mesh etwas eigenartig beleuchtet aussieht.
An deiner Stelle würde ich deshalb die Berechnung der Normalen deiner Grafikkarte überlassen (Besonders auf GeForce-Karten besser, da die automatische Berechnung kaum Rechenzeit kostet).Dies geht mit folgendem Enable-Bit :
Code:
  1.  
  2.  
  3. glEnable(GL_NORMALIZE);
  4.  
  5.  


<span style='color:green'>Blau gefärbte Linien :</span>
Das liegt daran, das sich deine Lichtquellen trotz der geänderten Farbangaben für deine Linien auch auf deren Farbwerte auswirken.Wenn du das vermeiden willst, dann musst du vor dem Zeichnen der Linien deine Beleuchtung deaktivieren :
Code:
  1.  
  2.  
  3. glDisable(GL_LIGHTING);
  4.  
  5. Linie(n) zeichnen...
  6.  
  7. glEnable(GL_LIGHTING);
  8.  
  9.  


<span style='color:green'>Zweite Lichtquelle "geht nicht" :</span>
Das liegt ganz einfach daran, das der Lichtkegel den du für deine zweite Lichtquelle definiert hast nirgendwo auf deinen Mesh trifft...er zeigt quasi in eine komplett falsche Richtung.Wenn du ein Spotlicht nutzen willst, dann musst du dir schon im Klaren sein, wohin es zeigt...meine Screenshot hab ich mit einer Position = 1,0.2,1,1 und einer Richtung = -1,0,1,1 gemacht.

<span style='color:green'>Unerlaubte Benutzung einiger Befehle innerhalb glBegin...glEnd : </span>
Due benutzt z.B. glFrontFace() innerhalb eines glBegin...glEnd-Blockes.Das ist von den OpenGL-Spezifikationen her nicht erlaubt.Nur wenige Befehle dürfen in einem solchen Block genutzt werden.Welche das sind, steht im RedBook.
Wenn das trotzdem geht, dann liegt das daran das die Grafikkartentreiber der GeForce-Karten fehlertoleranter sind...auf anderen Grakas kanns dann Probleme geben!

Hier noch ein Screenshot, den ich nach oben erwähnten Änderungen gemacht hab.Textur hab ich keine benutzt, da ich keine Lust hatte mir noch extra die glAux-Library herunterzuladen (die sollte man auch besser nicht mehr nutzen)...hoffe das Ganze entspricht jetzt eher deinen Vorstellungen :
Bild


Lies dir unbedingt mal das Redbook durch...das ist wirklich unerlässlich für JEDEN der OpenGL lernen will!

Hoffe geholfen zu haben

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 04, 2003 13:57 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 03, 2003 14:15
Beiträge: 36
:oops: :oops: :oops: :oops: :oops: :oops:

Hallo,


das mit dem RedBook und Euren Tuts weiß ich erst seit kurzem und ziehe es mir gerade runter. All das habe ich mir nur so zusammen gelesen und zusammen gereimt. Hast Du noch nen Tipp bzgl. der Bewegung mit der Maus oder finde ich da auch was im RedBook/Tuts ?

Gruss


Markus :(


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


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 15 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 | 15 Queries | GZIP : On ]