AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bild in opengl_würfel

Ein Thema von Poseidon · begonnen am 15. Okt 2008 · letzter Beitrag vom 15. Okt 2008
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#11

Re: Bild in opengl_würfel

  Alt 15. Okt 2008, 20:33
Ich seh gerade, dass du TexID nicht deklariert hast. Schreib folgendes hin:
Delphi-Quellcode:
var
  tex : PSDL_Surface;

  // Die Texture-ID
  // Du kannst entweder GLUint (GL unsigned integer)
  // oder TGLUint (Type GL unsigned integer)
  // oder DWORD (in der Windows.pas: type DWORD = cardinal;
  // oder einfach cardinal benutzen
  TexID : GLUint;
begin
  tex := IMG_Load('C:\Dokumente und Einstellungen\Mein Name\Eigene Dateien\Eigene Bilder.Bild1.jpg');
  { ... }
end;
Aber du solltest dir wirklich mal die Tutorials auf DelphiGL.com anschauen, so wie du das machst kann es überhaupt nicht funktionieren.

Hier mal ein ganz grobes (ungetesteted) Beispiel:
Delphi-Quellcode:
// Zuerst mal die richtigen Units einbinden
uses
  // Von TForm und von TTimer sowie noch ein paar andere
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls,
  
  // OpenGL und Hilf-Units
  dglOpenGl, sdl, sdl_image;
So, danach brauchen wir ein paar Variablen und Funktionen in der TForm1-Klasse:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    { ... noch nicht wichtig ... }
  private
    { Private-Deklarationen } 

    { Der Render-Context an sich }
    FDeviceContext : HDC;
    FRenderContext : HGLRC;

    { Die Textur }
    FTexture : GLUint;
   
    { Noch ein Paar Funktionen }
    procedure ErstelleOpenGL; // OpenGL laden und RenderContext erstellen
    procedure OpenGlZuruecksetzen; // OpenGL zurücksetzen
    procedure LadeTextur; // Läd eine Textur in "FTexture"
    procedure ZeichneAlles; // muss wohl nicht weiter erklärt werden
  public
    { Public-Deklarationen } 
  end;
So, jetzt füllen wir die Funktionen mit leben
Delphi-Quellcode:
procedure TForm1.ErstelleOpenGL;
begin
  InitOpenGL;

  FDeviceContext := GetDC(Handle);
  FRenderContext := CreateRenderingContext(FDeviceContext, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  ActiveRenderingContext(FDeviceContext, FDeviceContext);

  OpenGlZuruecksetzen;
end;

procedure TForm1.OpenGlZuruecksetzen;
begin
  // Den Buffer leeren
  glClearColor(0, 0, 0, 0);
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

  // Die Identitätsmatrix laden
  glLoadIdentity;
end;

procedure TForm1.LadeTextur;
var tex : PSDL_Surface;
begin
  tex := IMG_Load('C:\Dokumente und Einstellungen\Mein Name\Eigene Dateien\Eigene Bilder.Bild1.jpg');
  if assigned(tex) then
  begin
    glGenTextures(1, @FTexture);
    glBindTexture(GL_TEXTURE_2D, FTexture);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    // Achtung! Einige Bildformate erwarten statt GL_RGB, GL_BGR. Diese Konstante fehlt in den Standard-Headern
    glTexImage2D(GL_TEXTURE_2D, 0, 3, tex^.w, tex^.h,0, GL_RGB, GL_UNSIGNED_BYTE, tex^.pixels);

    SDL_FreeSurface(tex);
  end;
end;

procedure TForm1.ZeichneAlles;
begin
  OpenGlZuruecksetzen;

  // Texturen aktivieren
  glEnable(GL_TEXTURE_2D);
  // Unsere Textur als aktuelle Textur setzen
  glBindTexture(GL_TEXTURE_2D, FTexture);

  // noch ein paar Sachen intialisieren
  glDisable(GL_CULL_FACE);
  glDisable(GL_LIGHTING);

  // Nun ein einfaches Viereck zeichen
  glBegin(GL_QUADS);
    // mit glTexCoord2f sagen wir OpenGL, welche Ecke der Textur an welche Ecke
    // des Vertex "aufgehängt wird"
    glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -5.0);
    glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, -5.0);
    glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, -5.0);
    glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, -5.0);
  glEnd;

  // Und nun auf den Bildschirm bringen
  SwapBuffers(FDeviceContext);
end;
Nun brauchen wir einen Timer mit Intervall 1 und das FormCreate-Event:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  ErstelleOpenGL;
  LadeTextur;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  ZeichneAlles;
end;
Fertig. Ich hab den Quelltext jetzt nicht getestet, hab ihn einfach so ausm Kopf heruntergeschrieben. Hab auch schon länger nichts mehr mit OpenGL gemacht, daher kann es sein, dass manches nicht stimmt.
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat
Benutzerbild von Poseidon
Poseidon

Registriert seit: 8. Jul 2008
113 Beiträge
 
Delphi 2005 Personal
 
#12

Re: Bild in opengl_würfel

  Alt 15. Okt 2008, 21:20
Hab mal deine Version übernommen. Füre ich das Programm aus (F9) erscheint dieser Bildschierm (siehe Anhang). Bitte, Bitte hilf mir. Vielen, Vielen Dank schon mal im voraus.
Miniaturansicht angehängter Grafiken
fehlerscreenshot_155.jpg  
Im Zweifelsfall immer das Richtige tun
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz