![]() |
Bild in opengl_würfel
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Delphianer!
Ich hab mit opengl folgenden Würfel geproggt (siehe Anhang). Wie kann ich stad Farben Bilder nehmen und diese während der Laufzeit ändern? Würfel ist mit den Pfeiltasten drehbar. Danke im voraus. mfg Poseidon |
Re: Bild in opengl_würfel
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab ebenfalls mal so zur Übung ein kleines rotierendes Haus (mit Texturen) programmiert. Evtl. musst du die SDL_Image.pas noch irgendwo her laden.
edit: Drehungen erzeugt du durch Drehung der Objektmatrix. Wenn du das Über die Pfeiltasten machen willst, kannst du z.B. das OnKeyDown Ereignis nehmen und dadrin die Matrix um einen Winkel drehen (siehe Quelltext) Grüße |
Re: Bild in opengl_würfel
|
Re: Bild in opengl_würfel
Ja, Crosspost. Doppelt hält besser. Hab aber in beiden Fällen das selbe Problem: Wo bekomme ich SDL und SDL_Image her. Ohne scheint es nicht zu gehen. Danke für heure bisherige Hilfe.
|
Re: Bild in opengl_würfel
Hierhier z.B. (einfach mal googlen)
![]() |
Re: Bild in opengl_würfel
Mein Code Insgesamt:
Delphi-Quellcode:
Wenn ich ihn aus führe kommen Fehlermeldungen:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, opengl, StdCtrls, sdl, sdl_image, ExtCtrls; type TForm1 = class(TForm) Timer1: TTimer; procedure Timer1Timer(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject) ; procedure FormPaint(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); private mydc : HDC; myrc : HGLRC; myPalette : HPALETTE; procedure SetupPixelFormat; procedure Objekt; { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; rotx : integer; roty : integer; implementation {$R *.dfm} procedure Tform1.SetupPixelFormat; var hheap : Thandle; ncolors,i : integer; lppalette : plogpalette; byredmask, bygreenmask, bybluemask : byte; npixelformat : integer; pfd : Tpixelformatdescriptor; begin Fillchar(pfd,sizeof(pfd),0); with pfd do begin nsize := sizeof(pfd); nversion := 1; dwflags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER; ipixeltype := PFD_TYPE_RGBA; cColorbits := 24; cdepthbits := 32; ilayertype := PFD_Main_Plane; end; nPixelFormat:= ChoosePixelFormat(myDC, @pfd); SetPixelFormat(myDC, nPixelFormat, @pfd); DescribePixelFormat(myDC, nPixelFormat,sizeof(TPixelFormatDescriptor),pfd); if ((pfd.dwFlags and PFD_NEED_PALETTE) <> 0) then begin nColors := 1 shl pfd.cColorBits; hHeap := GetProcessHeap; lpPalette:= HeapAlloc (hHeap,0,sizeof(TLogPalette)+(nColors*sizeof(TPaletteEntry))); lpPalette^.palVersion := $300; lpPalette^.palNumEntries := nColors; byRedMask := (1 shl pfd.cRedBits) - 1; byGreenMask:= (1 shl pfd.cGreenBits) - 1; byBlueMask := (1 shl pfd.cBlueBits) - 1; for i := 0 to nColors - 1 do begin lpPalette^.palPalEntry[i].peRed := (((i shr pfd.cRedShift) and byRedMask) *255)DIV byRedMask; lpPalette^.palPalEntry[i].peGreen:= (((i shr pfd.cGreenShift)and byGreenMask)*255)DIV byGreenMask; lpPalette^.palPalEntry[i].peBlue := (((i shr pfd.cBlueShift) and byBlueMask) *255)DIV byBlueMask; lpPalette^.palPalEntry[i].peFlags:= 0; end; myPalette:= CreatePalette(lpPalette^); HeapFree(hHeap, 0, lpPalette); if (myPalette <> 0) then begin SelectPalette(myDC, myPalette, False); RealizePalette(myDC); end; end; end; procedure TForm1.FormCreate(Sender: TObject); begin form1.myDC:= GetDC(Handle); SetupPixelFormat; myRC:= wglCreateContext(myDC); wglMakeCurrent(myDC, myRC); glEnable(GL_DEPTH_TEST); glLoadIdentity; end; procedure TForm1.FormDestroy(Sender: TObject); begin wglmakecurrent(0,0); wgldeletecontext(mydc); releasedc(handle,mydc) end; procedure TForm1.FormPaint(Sender: TObject); begin Objekt; end; procedure tform1.Objekt; begin glClearColor(0, 0, 0.0, 1); // HintergundFarbe glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //Farb und Tiefenpuffer löschen glMatrixMode(GL_PROJECTION); // Darstellungsmodus = Projektionsmodus glLoadIdentity; glPolygonMode(GL_FRONT, GL_FILL); // Nur Vorderseiten darstellen (schneller) / Füllmodus : gefüllte Objekte glMatrixMode(GL_MODELVIEW); // Koordinatensystem drehen glLoadIdentity; // Setzt alles zurück auf Uhrsprungspunkt(sehr wichtig!)-ansonsten wird die Scene irgendwo dargestellt, aber nicht da, wo sie hin soll glPushmatrix(); glcolor3f(1,1,0); glrotate(rotx,1,0,0); //drehung um die x-achse glrotate(roty,0,1,0); //drehung um die y-achse glBegin(GL_QUADS); //dieser Befehl zeichnet einen Würfel. glVertex3d(0.5, -0.5, 0.5); //Linke Seite glVertex3d(-0.5, -0.5, 0.5); glVertex3d(-0.5, -0.5, -0.5); glVertex3d(0.5, -0.5, -0.5); glcolor3f(1,0,0); glVertex3d(-0.5, -0.5, -0.5); //Rückseite glVertex3d(-0.5, 0.5, -0.5); glVertex3d(0.5, 0.5, -0.5); glVertex3d(0.5, -0.5, -0.5); glcolor3f(1,0,1); glVertex3d(0.5, -0.5, -0.5); //Oberseite glVertex3d(0.5, 0.5, -0.5); glVertex3d(0.5, 0.5, 0.5); glVertex3d(0.5, -0.5, 0.5); glcolor3f(0,1,0); glVertex3d(-0.5, -0.5, 0.5); //Vorderseite glVertex3d(-0.5, 0.5, 0.5); glVertex3d(0.5, 0.5, 0.5); glVertex3d(0.5, -0.5, 0.5); glcolor3f(1,0.5,0); glVertex3d(-0.5, -0.5, 0.5); //Boden / Unterseite glVertex3d(-0.5, 0.5, 0.5); glVertex3d(-0.5, 0.5, -0.5); glVertex3d(-0.5, -0.5, -0.5); glcolor3f(0,0,1); glVertex3d(-0.5, 0.5, 0.5); //Rechte Seite glVertex3d(0.5, 0.5, 0.5); glVertex3d(0.5, 0.5, -0.5); glVertex3d(-0.5, 0.5, -0.5); glEnd(); SwapBuffers(form1.myDC); //scene darstellen end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if key = vk_down then begin rotx := rotx+1; end; if key = vk_up then begin rotx := rotx-1; end; if key = vk_right then begin roty := roty+1; end; if key = vk_left then begin roty := roty-1; end; repaint; end; procedure TForm1.Timer1Timer(Sender: TObject); 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, @TexID); glBindTexture(GL_TEXTURE_2D, TexID); 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; end. Undifinierter Bezeichner: glGenTextures Undifinierter Bezeichner: TexID Undifinierter Bezeichner: glBindTexture Was kann ich tun? |
Re: Bild in opengl_würfel
Sorry, hatte ich vergessen: Ich habe außerdem die dglOpenGL.pas von
![]() |
Re: Bild in opengl_würfel
Jetzt ist nurnoch TexID Undifiniert sonst weiß er alles.
|
Re: Bild in opengl_würfel
TexID ist ein cardinal - kannst also auch direkt cardinal oder DWORD hinschreiben.
Ach noch was: wenn du die dglOpenGL.pas benutzt, kannst du das "SetupPixelFormat" von der Unit übernehmen lassen und die Funktion bei dir rauslöschen. In der Readme.html seht geschrieben Before you can use any of the gl-functions contained in the header, you'll have to call InitOpenGL to initialize the functionpointers. In your app it should look something like that :
Delphi-Quellcode:
After doing the above initialisation, you're ready to use all OpenGL-Functions and extensions your card supports. And also don't forget to release your context properly when exiting :
procedure MyGLInit;
begin InitOpenGL; // Don't forget, or first gl-Call will result in an access violation! MyDC := GetDC(...); MyRC := CreateRenderingContext(...); ActivateRenderingContext(MyDC, MyRC); // Necessary, will also read some extension ... end;
Delphi-Quellcode:
procedure MyDeInit;
begin DeactivateRenderingContext; // Deactivates the current context wglDeleteContext(myRC); ReleaseDC(Handle, myDC); end; Dein FormCreate-Event ist dann zwar nicht viel kleiner, jedoch fällt die komplette "SetupPixelFormat" aus deinem Source weg.
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin InitOpenGL; MyDC := GetDC(Handle); MyRC := CreateRenderingContext(MyDC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0); ActiveRenderingContext(MyDC, MyRC); end; |
Re: Bild in opengl_würfel
Zitat:
|
Re: Bild in opengl_würfel
Ich seh gerade, dass du TexID nicht deklariert hast. Schreib folgendes hin:
Delphi-Quellcode:
Aber du solltest dir wirklich mal die Tutorials auf
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; ![]() Hier mal ein ganz grobes (ungetesteted) Beispiel:
Delphi-Quellcode:
So, danach brauchen wir ein paar Variablen und Funktionen in der TForm1-Klasse:
// 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;
Delphi-Quellcode:
So, jetzt füllen wir die Funktionen mit leben
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;
Delphi-Quellcode:
Nun brauchen wir einen Timer mit Intervall 1 und das FormCreate-Event:
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;
Delphi-Quellcode:
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.
procedure TForm1.FormCreate(Sender: TObject);
begin ErstelleOpenGL; LadeTextur; end; procedure TForm1.Timer1Timer(Sender: TObject); begin ZeichneAlles; end; |
Re: Bild in opengl_würfel
Liste der Anhänge anzeigen (Anzahl: 1)
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.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz