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

Aktuelle Zeit: Fr Jul 18, 2025 21:12

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



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Textur einbinden
BeitragVerfasst: Sa Okt 14, 2006 11:21 
Offline
DGL Member

Registriert: Di Nov 29, 2005 09:21
Beiträge: 13
Hallo,

ich fange grad mit OpenGL in Delphi an und versuche eine Textur einzubinden. Mein problem ist das sie nicht angezeigt wird, hier mein Code:

Code:
  1.  
  2.  
  3. var
  4.   i : integer;
  5.   MyTex : GLuint;
  6. begin
  7. if not Assigned(FSpiel) then
  8.   exit;
  9. //glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  10. //glTranslatef(0, 0, -5);
  11.  
  12. if FileExists(ExtractFilePath(ParamStr(0))+'tex/robot.jpg')then
  13.   begin            
  14.   glMatrixMode(GL_PROJECTION);
  15.   glLoadIdentity;
  16.   gluPerspective(45.0, Self.ClientWidth/Self.ClientHeight, NearClipping, FarClipping);
  17.  
  18.   glMatrixMode(GL_MODELVIEW);
  19.   glLoadIdentity;
  20.   LoadTexture('tex/robot.jpg', MyTex, False);
  21.  
  22.   glEnable(GL_TEXTURE_2D);
  23.   glBindTexture(GL_TEXTURE_2D, MyTex);
  24.   glEnable(GL_ALPHA_TEST);
  25.   glAlphaFunc(GL_GREATER, 0);
  26.  
  27.   if Assigned(FSpiel)and Assigned(FSpiel.FRobots) then
  28.     for i:= 0 to Pred(FSpiel.FRobots.FRobots.Count)do
  29.       with FSpiel.FRobots.FRobots.Robots[i] do
  30.         begin
  31.         glBegin(GL_QUADS);
  32.         glTexCoord2f(0,0); glVertex3f(-40/2, -40/2, -0);
  33.         glTexCoord2f(1,0); glVertex3f(+40/2, -40/2, -0);
  34.         glTexCoord2f(1,1); glVertex3f(+40/2, +40/2, -0);
  35.         glTexCoord2f(0,1); glVertex3f(-40/2, +40/2, -0);
  36.         glEnd;
  37.         end;
  38.   SwapBuffers(DC);
  39.   end;
  40.  
  41.  


Also die Textur sollte zweimal angezeigt werden. er geht durch die Schleife mit dem glbegin und glend zweimal durch. Aber ich habe nur einen Schwarzen Bildschirm und keine Textur.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 14, 2006 12:49 
Offline
DGL Member

Registriert: Sa Okt 22, 2005 20:24
Beiträge: 291
Wohnort: Frauenfeld/CH
was ich jetzt so sponan sehe sind 2 sachen:

1. du arbeitest mit -40 und +40 was dann zwar noch durch 2 dividiert wird aber auch so viel zu extrem ist, da reichen koordinaten von -1 und +1

2. du hast die kamera im punkt 0 und das bild ist auch auf punkt null, da siehst natürlich nichts. da musst du schauen das du entweder vorher ein gltranslate (in GL_PROJECTON oder GL_MODELVIEW) ausführst, oder eben das bild weiter nach hinten setzt, bzw z- koordinaten auf einen anderen punkt setzt und dann schaust ob dus siehst.

_________________
bester uo-shard: www.uosigena.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 14, 2006 13:07 
Offline
DGL Member

Registriert: Di Nov 29, 2005 09:21
Beiträge: 13
Also das ist ja jetz das wo ich was ändern muss:

Code:
  1.  
  2. if FileExists(ExtractFilePath(ParamStr(0))+texpath) then
  3.   begin
  4.   glTranslatef(1, 1, -5);//<-- Das eingefügt
  5.   LoadTexture(texpath,MyTex,False);
  6.   glBindTexture(GL_TEXTURE_2D,MyTex);
  7.   glEnable(GL_TEXTURE_2D);          
  8.   glEnable(GL_ALPHA_TEST);
  9.   glAlphaFunc(GL_GREATER, 0);
  10.   glBegin(GL_QUADS);
  11.   glTexCoord2f(0,0); glVertex3f(-1, -1, 0);//Hier geändert
  12.   glTexCoord2f(1,0); glVertex3f(+1, -1, 0);//Hier geändert
  13.   glTexCoord2f(1,1); glVertex3f(+1, +1, 0);//Hier geändert
  14.   glTexCoord2f(0,1); glVertex3f(-1, +1, 0);//Hier geändert
  15.   glEnd;
  16.   end;
  17.  


was genau muss ich jetz wo einfügen/ändern um die Textur anzeigen zu lassen?

//Edit: OKOK jetz wird das Teil angezeigt

Jetz muss ich es aber noch irgendwie schaffen das wenn das Ding an x:200/y:300(real aufm Bildschirm) ausgegeben werden soll, ads es auch da erscheint.
hier seh ich nur was von maximal 1 oder so, wie schaff ich das das ich das bei 200/300 ausgebe?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 14, 2006 13:30 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Wenn du eine textur relativ zu bildschirmkoords ausgeben willst, solltest du in den orthographischen modus wechseln per glortho


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 14, 2006 13:50 
Offline
DGL Member

Registriert: Di Nov 29, 2005 09:21
Beiträge: 13
:shock: HÄ? (Ich bin ein Mensch der mit Code glaub mehr anfangen kann als mit Worten :oops: )


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 14, 2006 14:04 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Ganz einfach:
So zb wechselst du in den 2d Mode:
Code:
  1.   glDisable(GL_TEXTURE_2D);
  2.   glDisable(GL_DEPTH_TEST);
  3.   glMatrixMode(GL_PROJECTION);
  4.   glPushMatrix();
  5.     glLoadIdentity();
  6.     glOrtho( 0, UseForm.WIDTH, 0,UseForm.HEIGHT, -1, 1 );
  7.     glMatrixMode(GL_MODELVIEW);
  8.     glPushMatrix();
  9.       glLoadIdentity();


Dann nutzt du ganz einfach die Pixel als Koordinaten also 300 und 400. Es gibt dann aber keine dritte Koordinate Z mehr.

Wenn du wieder raus willst nutzt du:
Code:
  1.       glEnable(GL_TEXTURE_2D);
  2.       glEnable(GL_DEPTH_TEST);
  3.       glMatrixMode(GL_PROJECTION);
  4.     glPopMatrix();
  5.     glMatrixMode(GL_MODELVIEW);
  6.   glPopMatrix();


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 14, 2006 15:38 
Offline
DGL Member

Registriert: Di Nov 29, 2005 09:21
Beiträge: 13
ok, soweit klappt das.

Jetzt möchte ich das ganze um die eigene Achse drehen, was mit folgendem code und nur einer Textur auch funktioniert. Aber was wenn ich diese textur mehrfach ausgeben will und sich jede davon um die eigene Achse drehen soll?

Hier mein jetziger code:

Code:
  1.  
  2.  
  3. // =============================================================================
  4. // Hier wird gezeichnet !!
  5. procedure TBFFeld.Render(Sender: TObject);
  6. begin
  7. // In die Projektionsmatrix wechseln
  8. glMatrixMode(GL_PROJECTION);
  9. // Identitätsmatrix laden
  10. glLoadIdentity;
  11. // Viewport an Clientareal des Fensters anpassen
  12. glViewPort(0, 0, ClientWidth, ClientHeight);
  13. // Perspective, FOV und Tiefenreichweite setzen
  14. gluPerspective(60, ClientWidth/ClientHeight, 1, 128);
  15.  
  16. // In die Modelansichtsmatrix wechseln
  17. glMatrixMode(GL_MODELVIEW);
  18. // Identitätsmatrix laden
  19. glLoadIdentity;
  20. // Farb- und Tiefenpuffer löschen
  21. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  22.  
  23. //ShowText;
  24. ShowGame;
  25. // Hinteren Puffer nach vorne bringen
  26. SwapBuffers(DC);
  27.  
  28. // Nummer des gezeichneten Frames erhöhen
  29. inc(Frames);
  30. // FPS aktualisieren
  31. if GetTickCount - StartTick >= 500 then
  32.  begin
  33.  FPS       := Frames/(GetTickCount-StartTick)*1000;
  34.  Frames    := 0;
  35.  StartTick := GetTickCount
  36.  end;
  37. end;
  38.  
  39. // =============================================================================
  40. //  TBFFeld.ShowText
  41. // =============================================================================
  42. //  FPS, Hilfstext usw. ausgeben
  43. // =============================================================================
  44. procedure TBFFeld.ShowText;
  45. begin
  46. // Tiefentest und Texturierung für Textanzeige deaktivieren
  47. glDisable(GL_DEPTH_TEST);
  48. glDisable(GL_TEXTURE_2D);
  49. // In orthagonale (2D) Ansicht wechseln
  50. glMatrixMode(GL_PROJECTION);
  51. glLoadIdentity;
  52. glOrtho(0,Width,Height,0, -1,1);
  53. glMatrixMode(GL_MODELVIEW);
  54. glLoadIdentity;
  55. PrintText(5,15, FloatToStr(FPS)+' fps');
  56. glEnable(GL_DEPTH_TEST);
  57. glEnable(GL_TEXTURE_2D);
  58. end;
  59.  
  60. // =============================================================================
  61. procedure TBFFeld.DrawQuad(pX, pY, pZ, pWidth, pHeight : Single);
  62. begin
  63. glBegin(GL_QUADS);
  64.  glTexCoord2f(0,0); glVertex3f(pX-pWidth/2, pY-pHeight/2, -pZ);
  65.  glTexCoord2f(1,0); glVertex3f(pX+pWidth/2, pY-pHeight/2, -pZ);
  66.  glTexCoord2f(1,1); glVertex3f(pX+pWidth/2, pY+pHeight/2, -pZ);
  67.  glTexCoord2f(0,1); glVertex3f(pX-pWidth/2, pY+pHeight/2, -pZ);
  68. glEnd;
  69. end;
  70.  
  71. procedure TBFFeld.ShowGame;
  72. var
  73.   i : integer;
  74.   MyTex : GLuint;
  75. const
  76.   texpath = 'tex/robot.jpg';
  77. begin
  78. BeginRender;
  79. if (testgrad < 0)or(testgrad > 359) then testgrad :=0
  80. else inc(testgrad);
  81. if FileExists(ExtractFilePath(ParamStr(0))+texpath) then
  82.   begin
  83.   LoadTexture(texpath,MyTex,False);
  84.   glBindTexture(GL_TEXTURE_2D,MyTex);
  85.   glEnable(GL_TEXTURE_2D);
  86.   glEnable(GL_ALPHA_TEST);
  87.   glAlphaFunc(GL_GREATER, 0);
  88.   glTranslatef(100, 100, 0);
  89.   glRotatef(testgrad, 0,0,1);
  90.   DrawQuad(0,0,0,40,40);
  91.   end;
  92. EndRender;
  93. end;
  94.  
  95. procedure TBFFeld.BeginRender;
  96. begin
  97. glDisable(GL_TEXTURE_2D);
  98. glDisable(GL_DEPTH_TEST);
  99. glMatrixMode(GL_PROJECTION);
  100. glPushMatrix();
  101. glLoadIdentity();
  102. glOrtho( 0, ClientWidth,ClientHeight, 0, -1, 1 );
  103. glMatrixMode(GL_MODELVIEW);
  104. glPushMatrix();
  105. glLoadIdentity();
  106. end;
  107.  
  108. procedure TBFFeld.EndRender;
  109. begin
  110. glEnable(GL_TEXTURE_2D);
  111. glEnable(GL_DEPTH_TEST);
  112. glMatrixMode(GL_PROJECTION);
  113. glPopMatrix();
  114. glMatrixMode(GL_MODELVIEW);
  115. glPopMatrix();
  116. SwapBuffers(DC);
  117. end;
  118.  
  119.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 14, 2006 16:13 
Offline
DGL Member

Registriert: Sa Okt 22, 2005 20:24
Beiträge: 291
Wohnort: Frauenfeld/CH
ähhm lädst du die textur bei jedem mal neu?

für mehrere texturen, mach einfach ein glpushmatrix vors translate und rotate, und danach ein glpopmatrix am ende, dann machst du das gleiche nochmal für ein anderes rechteck....

_________________
bester uo-shard: www.uosigena.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 15, 2006 11:36 
Offline
DGL Member

Registriert: Di Nov 29, 2005 09:21
Beiträge: 13
ok also das funzt jetzt, ich lade die texturen jetzt auch nichtmehr jedesmal :oops:

jetzt noch folgendes Problem:

ich ahbe zusätzlich zur Textur 1 eine Textur 2 die aber direkt über der Textur 1 liegt, diese jedoch dummerweise verdeckt. ich ahb im Tutorial gelesen das man das mit dem Alphatest macht, allerdings funktioniert das bei mir nicht so ganz.

Also ich ahb jetzt folgenden Code:

Code:
  1.  
  2. BeginRender;
  3. if (FRobotTex <> 0)and(FRadarTex<>0)and(FCanonTex<>0) then
  4.   begin
  5. //  glTranslatef(1, 1, -5);
  6.   glEnable(GL_TEXTURE_2D);
  7.  
  8.   for i:= 0 to Pred(FSpiel.FRobots.FRobots.Count) do
  9.     begin
  10.     glBindTexture(GL_TEXTURE_2D,FRobotTex);
  11.     glEnable(GL_ALPHA_TEST);
  12.     glAlphaFunc(GL_GREATER, 0.1);
  13.     glPushMatrix();
  14.     glTranslatef(FSpiel.FRobots.FRobots.Robots[i].X,FSpiel.FRobots.FRobots.Robots[i].Y, 0);
  15.     glRotatef(FSpiel.FRobots.FRobots.Robots[i].FDirection, 0,0,1);
  16.     DrawQuad(0,0,0,40,40);
  17.     glPopMatrix();
  18.  
  19.     glBindTexture(GL_TEXTURE_2D,FCanonTex);
  20.     glEnable(GL_ALPHA_TEST);
  21.     glAlphaFunc(GL_GREATER, 0.1);
  22.     glPushMatrix();
  23.     glTranslatef(FSpiel.FRobots.FRobots.Robots[i].X,FSpiel.FRobots.FRobots.Robots[i].Y, 0);
  24.     glRotatef(FSpiel.FRobots.FRobots.Robots[i].FCanonDirection, 0,0,1);
  25.     DrawQuad(0,0,0.1,40,40);
  26.     glPopMatrix();
  27.  
  28.     glBindTexture(GL_TEXTURE_2D,FRadarTex);
  29.     glEnable(GL_ALPHA_TEST);
  30.     glAlphaFunc(GL_GREATER, 0.1);
  31.     glPushMatrix();
  32.     glTranslatef(FSpiel.FRobots.FRobots.Robots[i].X,FSpiel.FRobots.FRobots.Robots[i].Y, 0);
  33.     glRotatef(FSpiel.FRobots.FRobots.Robots[i].FRadarDirection, 0,0,1);
  34.     DrawQuad(0,0,0.2,40,40);
  35.     glPopMatrix();
  36.     end;
  37.   end;
  38. EndRender;
  39.  


Muss ich diese

glEnable(GL_ALPHA_TEST);

und

glAlphaFunc(GL_GREATER,0.1);

woanders hinmachen? Oder muss ich bei den Bildern was einstellen? Die Bilder sind mittlerweile BMPs mit schwarzem Hintergrund und momentan farbigem Motiv. Das farbige soll dargestellt werden und das schwarze weg.

//edit: Ich merk grad ads ich im falschen forum bin, das gehört eigentlich zu den Einsteigerfragen oder? :oops:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 17, 2006 21:28 
Offline
DGL Member

Registriert: Di Nov 29, 2005 09:21
Beiträge: 13
OK, mein Tool konnte nur 24 Bit, mit 32 bit gehts jetzt :)


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


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 3 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 16 Queries | GZIP : On ]