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 1 von 2  1 2      
Benutzerbild von Poseidon
Poseidon

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

Bild in opengl_würfel

  Alt 15. Okt 2008, 18:11
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
Angehängte Dateien
Dateityp: exe project1_959.exe (370,0 KB, 33x aufgerufen)
Im Zweifelsfall immer das Richtige tun
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Bild in opengl_würfel

  Alt 15. Okt 2008, 18:28
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
Angehängte Dateien
Dateityp: rar opengl_haus_175.rar (396,6 KB, 23x aufgerufen)
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
Benutzerbild von Marc.
Marc.

Registriert seit: 14. Mär 2008
Ort: Aachen
22 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Bild in opengl_würfel

  Alt 15. Okt 2008, 18:38
Crosspost: http://www.delphi-forum.de/viewtopic.php?t=87302
  Mit Zitat antworten Zitat
Benutzerbild von Poseidon
Poseidon

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

Re: Bild in opengl_würfel

  Alt 15. Okt 2008, 18:42
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.
Im Zweifelsfall immer das Richtige tun
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Bild in opengl_würfel

  Alt 15. Okt 2008, 18:49
Hierhier z.B. (einfach mal googlen) http://sourceforge.net/project/showf...group_id=43805
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
Benutzerbild von Poseidon
Poseidon

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

Re: Bild in opengl_würfel

  Alt 15. Okt 2008, 19:30
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?
Im Zweifelsfall immer das Richtige tun
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#7

Re: Bild in opengl_würfel

  Alt 15. Okt 2008, 19:40
Sorry, hatte ich vergessen: Ich habe außerdem die dglOpenGL.pas von www.delphigl.com verwendet. Die vermisst dein Compiler jetzt noch.
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
Benutzerbild von Poseidon
Poseidon

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

Re: Bild in opengl_würfel

  Alt 15. Okt 2008, 19:51
Jetzt ist nurnoch TexID Undifiniert sonst weiß er alles.
Im Zweifelsfall immer das Richtige tun
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

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

Re: Bild in opengl_würfel

  Alt 15. Okt 2008, 20:09
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;
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
 
#10

Re: Bild in opengl_würfel

  Alt 15. Okt 2008, 20:56
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
Im Zweifelsfall immer das Richtige tun
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 20:30 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