Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Bild in opengl_würfel (https://www.delphipraxis.net/122410-bild-opengl_wuerfel.html)

Poseidon 15. Okt 2008 17:11


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

alleinherrscher 15. Okt 2008 17:28

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

Marc. 15. Okt 2008 17:38

Re: Bild in opengl_würfel
 
Crosspost: http://www.delphi-forum.de/viewtopic.php?t=87302

Poseidon 15. Okt 2008 17:42

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.

alleinherrscher 15. Okt 2008 17:49

Re: Bild in opengl_würfel
 
Hierhier z.B. (einfach mal googlen) http://sourceforge.net/project/showf...group_id=43805

Poseidon 15. Okt 2008 18:30

Re: Bild in opengl_würfel
 
Mein Code Insgesamt:
Delphi-Quellcode:
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.
Wenn ich ihn aus führe kommen Fehlermeldungen:
Undifinierter Bezeichner: glGenTextures
Undifinierter Bezeichner: TexID
Undifinierter Bezeichner: glBindTexture

Was kann ich tun?

alleinherrscher 15. Okt 2008 18:40

Re: Bild in opengl_würfel
 
Sorry, hatte ich vergessen: Ich habe außerdem die dglOpenGL.pas von www.delphigl.com verwendet. Die vermisst dein Compiler jetzt noch.

Poseidon 15. Okt 2008 18:51

Re: Bild in opengl_würfel
 
Jetzt ist nurnoch TexID Undifiniert sonst weiß er alles.

littleDave 15. Okt 2008 19:09

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:
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;
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 :

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;

Poseidon 15. Okt 2008 19:56

Re: Bild in opengl_würfel
 
Zitat:

Zitat von littleDave
TexID ist ein cardinal - kannst also auch direkt cardinal oder DWORD hinschreiben.

Dann muss ich aber was in klammern hintendranschreiben. Weiß aber leider nicht was. Der Tipp mit dem weglasen von "SetupPixelFormat" wird mir viel schreibarbeit ersparen. Klasse Tipp :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:39 Uhr.
Seite 1 von 2  1 2      

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