Autor Beitrag
M. Raab
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 334
Erhaltene Danke: 1

WIN 7
Delphi XE
BeitragVerfasst: So 29.12.02 15:26 
Hallo NG,

habe folgendes Problem - ich möchte, dass eine Szene in OpenGL mit einer Texture versetzt wird.

Folgenden kleinen Test-Programmcode habe ich mal gemacht:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
procedure .....
     glgetfloatv(gl_line_width_range,@lwd);
     glgetfloatv(gl_line_width_granularity,@step);

     glClearColor(0.6,0.6,0.6,1);
     glenable(gl_depth_test);
     glMatrixMode(GL_PROJECTION);
     glclear(GL_color_buffer_bit or gl_depth_buffer_bit);
     glviewport(0,0,ebene.width,Ebene.height);

     glbegin(gl_line_strip);
     glcolor3f(1,1,1);
     for lauf1:=1 to BLMPMAX do
       begin
         if BLI[lauf1]=lauf2 then
           begin
             glvertex3f(D3x[lauf1],D3y[lauf1],D3z[lauf1]);
           end else begin
             glend;
             glbegin(gl_line_strip);
             glvertex3f(D3x[lauf1],D3y[lauf1],D3z[lauf1]);
             lauf2:=lauf2+1;
           end;
       end;
     glend;



Die ganze Szene läuft prima und funktioniert auch. Nun möchte ich die gezeichneten Linien (eigentlich ist das ganze in unregelmäßiges Gitter) mit einer Textur versehen, so das das eine Fläche wird. Später dann auch mal mit Licht und Schatten, so weit bin ich aber noch nicht. Ein weiterer Schritt wäre, die Textur aus einer Datei zu lesen, die als JPEG vorliegt.

Kann mir das jemand erklären - kurz und bündig für nen Anfänger wie mich ???? :oops:

Danke und Gruß an alle ANFÄNGER und PROFIS (die sind hier gefragt!!) :wink:

Gruß


Markus
M. Raab Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 334
Erhaltene Danke: 1

WIN 7
Delphi XE
BeitragVerfasst: Di 31.12.02 14:09 
Hallo,

im FORUM habe ich einige Tipps gelesen, so dass ich mir die Antwort selber geben kann und dabei schon ein neues PROBLEM :cry: auftaucht:

Folgenden Code zur Einbindung einer Texture habe ich gemacht:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
       texture1 : PTAUX_RGBIMAGERec;
       tex      : PgluInt;
       tex2     : cardinal;
   begin
     /// Textur einrichten und erzeugen
     texture1:=auxDIBImageLoada('GRANIT.BMP);
     glGenTextures(1,tex);
     glBindTexture(GL_TEXTURE_2D,tex2);
     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINear);
     glTexParameteri(GL_Texture_2D,GL_Texture_min_filter,GL_LINEAR);
     glTexImage2D(GL_TEXTURE_2D,0,3,texture1^.sizeX,texture1.sizeY,0,
                  GL_RGB,GL_UNSIGNED_BYTE,Texture1.data);
     glbindtexture(GL_Texture_2D,tex2);


Das wird sauber compiliert aber zur Laufzeit kommt eine Zugriffsverletzung bei Adresse 00000 etc etc etc Was mache ich falsch ?


Kann mir jemand helfen ?

Gruß

Markus
torstenheinze
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 461



BeitragVerfasst: Di 31.12.02 16:48 
bei mir gibt es auch manchmal solche fehler, wenn beispielsweise an dem tag ein gravierender fehler mit opengl aufgetaucht ist, dann kann ich manchmal einige andere opengl anwendungen danach nicht mehr starten, bei mir hilft da nur neustarten.

ich nutze auch diese procedure wie du, und bei mir geht das aber wunderbar.

naja, vieleicht hat jemand eine erklährung. :nixweiss:
M. Raab Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 334
Erhaltene Danke: 1

WIN 7
Delphi XE
BeitragVerfasst: Mi 01.01.03 15:21 
Hallo,

also, den Grund für die Abstürze habe ich gefunden. Man darf die OPENGL12 und die GLAUX nicht gleichzeit unter USES einbinden. Sobald Funktionen der GALUX benutzt werden, stribt das System - den genauen Grund kenn ich nicht. In jedem Fall benutze ich jetzt die GLAUX.DLL und binde die Funktionen so ein. ABER: ein neues Problem :cry: :cry:

Hier der Code:

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
 procedure DrawScene;
   const ambient     : array[0..3] of GLFloat=(0.3,0.3,0.3,1);
         position1   : array[0..3] of GLFloat=(0.0,0.2,1.0,1);
         position2   : array[0..3] of GLFloat=(0.0,-0.2,1.0,1);
         direction1  : array[0..2] of GLFLoat=(0.0,0.0,-1.0);
         direction2  : array[0..2] of GLFLoat=(0.0,0.0,1.0);
         MatAMbient  : array[0..3] of GLFloat=(0.0,0.2,0.6,1.0);
         MatEmission : array[0..3] of GLFloat=(0.3,0.3,0.9,1.0);

   var lauf1    : integer;
       lauf2    : integer;
       lauf3    : integer;
       lauf4    : integer;
       lauf5    : integer;
       lauf6    : integer;
       lauf7    : integer;
       lauf8    : integer;
       lwd      : array[0..1] of glfloat;
       wdt      : glfloat;
       step     : glfloat;


 begin

    texture1 := auxDIBImageLoadA('granit.bmp');
    if not Assigned( texture1 ) then begin
      MessageBox(0,'Texturenpfad oder Dateiname falsch!'+#13+' Bitte den Pfad überprüfen!','Fehler beim Laden der Textur!',MB_OK or MB_ICONERROR);
    end;
    glGenTextures(1, tex);
    glBindTexture(GL_TEXTURE_2D, tex);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, texture1^.sizeX, texture1^.sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, texture1^.data);
    glbindtexture(GL_Texture_2D,tex);

    glviewport(0,0,ebene.width,Ebene.height);
    glClearColor(0.6,0.6,0.6,1);
    glclear(GL_color_buffer_bit or gl_depth_buffer_bit);
    glenable(gl_texture);
    glMatrixMode(GL_PROJECTION);

    glEnable(GL_LIGHTING);
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT,@Ambient);
    glLightModelf(GL_LIGHT_MODEL_TWO_SIDE,1.0);
    glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER,1.0);

    glMaterialfv(GL_FRONT, GL_AMBIENT, @MatAmbient);
    glMaterialfv(GL_FRONT, GL_EMISSION,@MatEmission);
    glMaterialf(GL_FRONT, GL_SHININESS, 50);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHT1);

    glLightfv(GL_LIGHT0,GL_AMBIENT,@Ambient);
    glLightfv(GL_LIGHT0,GL_POSITION,@Position1);
    glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,@Direction1);
    glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,90);
    glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,10);

    glLightfv(GL_LIGHT1,GL_AMBIENT,@Ambient);
    glLightfv(GL_LIGHT1,GL_POSITION,@Position2);
    glLightfv(GL_LIGHT1,GL_SPOT_DIRECTION,@Direction2);
    glLightf(GL_LIGHT1,GL_SPOT_CUTOFF,90);
    glLightf(GL_LIGHT1,GL_SPOT_EXPONENT,10);

    glgetfloatv(gl_line_width_range,@lwd);
    glgetfloatv(gl_line_width_granularity,@step);
    gllinewidth(lwd[1]/4);

    glbegin(gl_line_strip);
    glcolor3f(1,1,1);
    glvertex3f(0,-0.2,0);
    glvertex3f(0,0.2,0);
    glend;

    glbegin(gl_line_strip);
    glcolor3f(1,1,1);
    glvertex3f(-0.2,0,0);
    glvertex3f(0.2,0,0);
    glend;

    glbegin(gl_line_strip);
    glcolor3f(1,1,1);
    glvertex3f(0,0,-0.2);
    glvertex3f(0,0,0.2);
    glend;

    glbegin(gl_triangle_strip);
    glTexCoord2f(0,0);glvertex3f(d3x[1],d3y[1],d3z[1]);
    lauf7:=0;              
    lauf8:=BLINDEX[2]; 

    for lauf1:=1 to BLMAX-1 do
      begin
        lauf3:=BLINDEX[lauf1];    
        lauf4:=BLINDEX[lauf1+1]; 
        lauf5:=1;                 
        lauf6:=0;                 
        for lauf2:=2 to max(BLINDEX[lauf1],BLINDEX[lauf1+1]) do
          begin
            lauf5:=lauf5+1;
            if lauf5>lauf3 then
              lauf5:=lauf3;

            lauf6:=lauf6+1;
            if lauf6>lauf4 then
              lauf6:=lauf4;

            gltexcoord(0/0);glvertex3f(d3x[lauf7+lauf5],d3y[lauf7+lauf5],d3z[lauf7+lauf5]);  
            gltexcoord(1/1);glvertex3f(d3x[lauf8+lauf6],d3y[lauf8+lauf6],d3z[lauf8+lauf6]);  
          end;
        glend;

       /// LINIEN ZEICHNEN START
        glbegin(gl_line_strip);
        gllinewidth(lwd[1]/2);
        glcolor3f(1.0,0.0,0.0);
        glvertex3f(d3x[lauf7+1],d3y[lauf7+1],d3z[lauf7+1]);
        glvertex3f(ax[lauf7+1],ay[lauf7+1],d3z[lauf7+1]);
        glcolor3f(0.5,0.5,0.0);
        glvertex3f(E3X[lauf8],E3Y[lauf8],E3Z[lauf8]);
        glend;
        /// LINIEN ZEICHNEN ENDE

        glbegin(gl_triangle_strip);
        lauf8:=lauf8+BLINDEX[lauf1+1];
        lauf7:=lauf7+BLINDEX[lauf1];
        glTexCoord2f(0,0);glvertex3f(d3x[lauf7+1],d3y[lauf7+1],d3z[lauf7+1]);
      end;
    glend;

    swapbuffers(DC);

  end;
//*******************************************************************


Also, die Prozedur läuft, aber die TEXTUR wird nicht eingebunden. Je nachdem welche Lichtfarbe ich wähle, erscheint die Oberfläche in der entsprechenden Farbe - keine Textur. Die zweite Lampe funktioniert überhaupt nicht - obwohl die Definitionen richtig scheinen. Zudem scheinen die gezeichneten Linien aus der Fläche durch. Je näher an der Lichtquelle 0 desto besser. Sie sollten aber im Hintergrund bleiben.

Das andere Problem: die Fläche hat Höhen und Tiefen - eine Landschaft. Sobald ich aber drehe, erscheinen diese Tiefen schwarz.

Nun ja ... vielleicht kann mir jemand helfen, langsam verzweifle ich nämlich.


Gruß und ein G U T E S N E U E S J A H R 2003 an ALLE !!! :welcome:

:party: :nut:

Gruß


Markus