Seite 1 von 2

Delphi Funktionsaufruf - OpenGl Tut Terrain [gelöst]

Verfasst: 04.02.2008 00:00
von Scarabol
Hi Leute,

ich arbeite mich gerade durch einige OpenGl Tutorials und versuche nun mit OpenGl eine Skybox zu erstellen.
Guckst du hier:
http://wiki.delphigl.com/index.php/Tutorial_Skyboxen

Manko bei diesen Tutorials...sie sind alle in Delphi geschrieben :(
Bisher hat es trotzdem ganz gut funktioniert, doch nun scheitere ich an einem funktionsaufruf und zwar dieser hier:

procedure TGLForm.LoadSkyBox;
const
SkyBoxName : array[0..5] of String = ('BK', 'FR', 'DN', 'UP', 'LF', 'RT');
var
i : Integer;
begin
for i := 0 to High(SkyBoxTexture) do
begin
SkyBoxTexture := TGLBmp.Create;
SkyBoxTexture.LoadImage(SkyBoxName+'.jpg');
SkyBoxTexture.SetTextureWrap(GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE);
SkyBoxTexture.GenTexture(False, False);

end;
GenerateSkyBox(256, 256, 256);
end;

Soweit ist mir alles klar worums geht, doch in den fett markierten Zeilen versteh ich nicht welche Funktionen hier benutzt werden....

Sind das OpenGl Funktionen?
Sind es überhaupt Funktionen?

Bitte um Aufklärung....

Gruß
Scarabol

Verfasst: 04.02.2008 00:23
von milan1612
Das sind meiner Meinung nach Methoden der Klasse TGLBmp :wink:

Verfasst: 04.02.2008 00:27
von Scarabol
öhm joa, aber wie ist die definiert?

Ich müsste die ja dann ebenfalls nachcoden oder?

Ich hab das hier noch gefunden:
http://www.programmersheaven.com/downlo ... pView.aspx

Gruß
Scarabol

Verfasst: 04.02.2008 00:36
von Scarabol
OMG!!!

Das scheint ja alles nur die eine Klasse zu sein....

Bin ja generell dafür das man das Rad nicht zweimal erfindet :)

Währe also nett wenn mir einer seine Lösung mitteilen könnte wie man vielleicht das ganze auch ohne diese Klasse machen kann.... denke das das Tutorial schon einige male gemacht wurde....

Gruß
Scarabol

Verfasst: 06.02.2008 03:26
von Susi55
Hallo @Scarabol,

die Klasse TGLBmp (wird bei Deinem Link mitgeliefert) ist 1744 Zeilen lang, aber das willst Du ja bestimmt nicht wissen.

Das in TGLBmp sind keine OpenGl Funktionen.

Sie läd die Dateien 'BK.jpg', 'FR.jpg', 'DN.jpg', 'UP.jpg', 'LF.jpg', 'RT.jpg'
und übergibt den Speicherbereich mit der Funktion Bind() an glBindTexture(...),
( in der Funktion GenerateSkyBox(256, 256, 256); )

Und da bist Du wieder bei OpenGl und kannst Dein Tutorial weiterschreiben, siehe SkyBox1.pas.

Die Bind Funktion

Code: Alles auswählen

// Name       : Bind
// Desription : Binds this images texture ID to the current OpenGL texture
//              unit
// Parameters : None
procedure TGLBMP.Bind();
begin
  if TextureID > 0 then
    glBindTexture(GL_TEXTURE_2D, TextureID);
end;
GenerateSkyBox ist in der Datei SkyBox1.pas beschrieben.

http://wiki.delphigl.com/index.php/GlBindTexture

Du solltest Deine Delphikenntnisse auffrischen.

In der Datei dlgOpenGL.pas ( 8823 Zeilen ) sind die Wrapper-Funktionen erklärt.

Viel Spass,
wir werden ja bis Weinachten nichts mehr von Dir hören.

Verfasst: 06.02.2008 10:39
von Scarabol
Du vergisst leider das die Klasse die Texturen noch verändert siehe SetTexture und GenTexture. Oder kann ich das ignorieren?

Gruß
Scarabol

Verfasst: 06.02.2008 11:41
von Scarabol
Hi Leute,

hier mal mein aktueller Versuch das Tut umzusetzen....

Leider wird hier nichts angezeigt....

Code: Alles auswählen


XIncludeFile "glu.pbi"

Structure GLscreen
  container.l
  hWnd.l
  hDC.l
EndStructure

InitSprite()
InitMouse()
InitKeyboard()

Procedure createdraw()
  
  Circle(100,100,50,RGB(200,0,0))
 
  DrawingMode(#PB_2DDrawing_Outlined)
  Box(150,20,20,20, RGB(255,0,0)) 
     
  FrontColor(RGB(255,255,0))
  For k=0 To 20
    LineXY(10,10+k*8,200, 0)
  Next
 
  ;DrawingMode(#PB_2DDrawing_Transparent)
  BackColor(RGB(100,255,0))
  FrontColor(RGB(0,0,255))
  DrawText(15,50,"pebisoft")
  DrawingMode(#PB_2DDrawing_Outlined)
  Box(0,0,255,255,RGB(192,192,192))
 
EndProcedure

Procedure FindNextExp(Val)
  While a < Val
    a = 1 << b
    b + 1
  Wend
  ProcedureReturn a
EndProcedure

Procedure GLLoadAlphaTexture(image_nr,img_file.s,Filename.s,Texfilter,TransparentColor.l)
  
  If img_file="file"
    img       = LoadImage(#PB_Any, Filename.s)
    Width.l   = FindNextExp(ImageWidth(img))
    Height.l  = FindNextExp(ImageHeight(img))
    ResizeImage(img, Width, Height)
    Size.l    = Width * Height * 4
  EndIf
  
  If img_file="image" 
    img.l = CreateImage(#PB_Any,256,256,24)
    Width.l   = FindNextExp(ImageWidth(img))
    Height.l  = FindNextExp(ImageHeight(img))
    ResizeImage(img, Width, Height)
    Size.l    = Width * Height * 4
  EndIf 
  
  Dim ImageData.b(Size)
  
  bmi.BITMAPINFO
  bmi\bmiHeader\biSize        = SizeOf(BITMAPINFOHEADER)
  bmi\bmiHeader\biWidth       = Width
  bmi\bmiHeader\biHeight      = Height
  bmi\bmiHeader\biPlanes      = 1
  bmi\bmiHeader\biBitCount    = 32
  bmi\bmiHeader\biCompression = #BI_RGB
  bmi\bmiHeader\biSizeImage   = (bmi\bmiHeader\biWidth * bmi\bmiHeader\biHeight * bmi\bmiHeader\biBitCount / 8)-1
  
  hdc = StartDrawing(ImageOutput(img))
    If img_file="image"
      createdraw()
    EndIf
    GetDIBits_(hdc, ImageID(img), 0, bmi\bmiHeader\biHeight, @ImageData(0), bmi, #DIB_RGB_COLORS)
  StopDrawing()
  
  red   = Red (TransparentColor)
  green = Green(TransparentColor)
  blue  = Blue (TransparentColor)
  
  For k=0 To Size-1 Step 4
    b = ImageData(k  ) & $FF
    g = ImageData(k+1) & $FF
    r = ImageData(k+2) & $FF
    
    If r = red And g = green And b = blue
      ImageData(k+3) = 0
    Else
      ImageData(k+3) = $ff
    EndIf
    
    ImageData(k+2) = b
    ImageData(k  ) = r
  Next
  
  glGenTextures_(image_nr, @Tex)   
  glBindTexture_(#GL_TEXTURE_2D, Tex)
  glTexImage2D_(#GL_TEXTURE_2D, 0, #GL_RGBA, Width, Height, 0, #GL_RGBA, #GL_UNSIGNED_BYTE, @ImageData(0))
  
  If TexFilter = 0 
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_NEAREST)
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_NEAREST)
  ElseIf TexFilter = 1
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR)
  EndIf
  
  FreeImage(img)
  
  ProcedureReturn Tex
EndProcedure

Procedure OpenGLScreen(*p.GLscreen,hwnd)
  If *p
    If hwnd
      hdc = GetDC_(hwnd)
      pfd.PIXELFORMATDESCRIPTOR
      pfd\nSize = SizeOf(PIXELFORMATDESCRIPTOR)
      pfd\nVersion = 1
      pfd\dwFlags = #PFD_SUPPORT_OPENGL | #PFD_DOUBLEBUFFER | #PFD_DRAW_TO_WINDOW
      pfd\iLayerType = #PFD_MAIN_PLANE
      pfd\iPixelType = #PFD_TYPE_RGBA
      pfd\cColorBits = 32
      pfd\cDepthBits = 32
      pixformat = ChoosePixelFormat_(hdc, pfd)
      SetPixelFormat_(hdc, pixformat, pfd)
      hrc = wglCreateContext_(hdc)
      wglMakeCurrent_(hdc, hrc)
      SwapBuffers_(hdc)
      *p\container = container
      *p\hWnd      = hwnd
      *p\hDC       = hdc
     
       glMatrixMode_(#GL_PROJECTION)
       gluPerspective_(45, 1, 0.1,1000)
       glMatrixMode_(#GL_MODELVIEW)
       glEnable_(#GL_ALPHA_TEST)
       glAlphaFunc_(#GL_GREATER, 0)
      
       glShadeModel_(#gl_smooth)
       glClearColor_( 0, 0.5, 1, 0)
       glClearDepth_(1)
       glEnable_(#GL_DEPTH_TEST)
       glDepthFunc_(#gl_lequal)
       glHint_(#gl_perspective_correction_hint,#gl_nicest)
       glEnable_ (#GL_COLOR_MATERIAL)
       glEnable_(#GL_TEXTURE_2D)
      
      ProcedureReturn 1
    EndIf
  EndIf
EndProcedure

Procedure FPS(timer.l)
  Static FPSCount.l, FPS.l
  Static delay.l
  Protected t.l
  If timer = 0
    ProcedureReturn -1
  EndIf
  t = ElapsedMilliseconds()
  If t-delay > timer
    FPS = FPSCount*1000/timer
    FPSCount = 0
    delay = t
  Else
    FPSCount+1
  EndIf
  ProcedureReturn FPS
EndProcedure

Global SkyBoxList
Global Texture_1

Procedure GenerateSkyBox(pWidth.f, pHeight.f, pLength.f)
  Protected px.f, py.f, pz.f
  SkyBoxList = glGenLists_(1)
  glNewList_(SkyBoxList, #GL_COMPILE)
   px = - pWidth  / 2
   py = - pHeight / 2
   pz = - pLength / 2
   glBindTexture_(#GL_TEXTURE_2D, Texture_1)
   glBegin_(#GL_QUADS)
    glTexCoord2f_(0, 0); glVertex3f(px,          py,           pz);
    glTexCoord2f_(0, 1); glVertex3f(px,          py + pHeight, pz);
    glTexCoord2f_(1, 1); glVertex3f(px + pWidth, py + pHeight, pz);
    glTexCoord2f_(1, 0); glVertex3f(px + pWidth, py,           pz);
   glEnd_()
   glBindTexture_(#GL_TEXTURE_2D, Texture_1)
   glBegin_(#GL_QUADS);
    glTexCoord2f_(1, 0); glVertex3f(px,          py,           pz + pLength);
    glTexCoord2f_(1, 1); glVertex3f(px,          py + pHeight, pz + pLength);
    glTexCoord2f_(0, 1); glVertex3f(px + pWidth, py + pHeight, pz + pLength);
    glTexCoord2f_(0, 0); glVertex3f(px + pWidth, py,           pz + pLength);
   glEnd_()
   glBindTexture_(#GL_TEXTURE_2D, Texture_1)
   glBegin_(#GL_QUADS);
    glTexCoord2f_(1, 1); glVertex3f(px + pWidth, py, pz);
    glTexCoord2f_(1, 0); glVertex3f(px + pWidth, py, pz + pLength);
    glTexCoord2f_(0, 0); glVertex3f(px,          py, pz + pLength);
    glTexCoord2f_(0, 1); glVertex3f(px,          py, pz);
   glEnd_()
   glBindTexture_(#GL_TEXTURE_2D, Texture_1)
   glBegin_(#GL_QUADS);
    glTexCoord2f_(0, 0); glVertex3f(px,          py + pHeight, pz);
    glTexCoord2f_(0, 1); glVertex3f(px,          py + pHeight, pz + pLength);
    glTexCoord2f_(1, 1); glVertex3f(px + pWidth, py + pHeight, pz + pLength);
    glTexCoord2f_(1, 0); glVertex3f(px + pWidth, py + pHeight, pz);
   glEnd_()
   glBindTexture_(#GL_TEXTURE_2D, Texture_1)
   glBegin_(#GL_QUADS);
    glTexCoord2f_(1, 0); glVertex3f(px, py,           pz);
    glTexCoord2f_(0, 0); glVertex3f(px, py,           pz + pLength);
    glTexCoord2f_(0, 1); glVertex3f(px, py + pHeight, pz + pLength);
    glTexCoord2f_(1, 1); glVertex3f(px, py + pHeight, pz);
   glEnd_()
   glBindTexture_(#GL_TEXTURE_2D, Texture_1)
   glBegin_(#GL_QUADS);
    glTexCoord2f_(0, 0); glVertex3f(px + pWidth, py,           pz);
    glTexCoord2f_(1, 0); glVertex3f(px + pWidth, py,           pz + pLength);
    glTexCoord2f_(1, 1); glVertex3f(px + pWidth, py + pHeight, pz + pLength);
    glTexCoord2f_(0, 1); glVertex3f(px + pWidth, py + pHeight, pz);
   glEnd_()
  glEndList_()
EndProcedure

  
  OpenWindow(0, 0, 0, 800,600,  "test1", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  OpenWindowedScreen(WindowID(0), 10, 10, 500, 500, 0, 0, 0)
  hwnd = ScreenID()
  
  OpenGLScreen(screen.GLscreen,hwnd)
  
  UseTGAImageDecoder()
  UseJPEGImageDecoder()
  UsePNGImageDecoder()
  
  Global Texture_1  =  GLLoadAlphaTexture(1,"image","",0,0)
  
  GenerateSkyBox(256,256,256)
  
  Repeat
    
    Event = WaitWindowEvent(0)
    
    WindowID = EventWindow()
    
    GadgetID = EventGadget()
    
    EventType = EventType()
    
    ExamineKeyboard()
    ExamineMouse()
    
    AngleY + MouseDeltaX()*0.2
    AngleX + MouseDeltaY()*0.2
    
    glDepthMask_(#False)
    glMatrixMode_(#GL_MODELVIEW)
    glLoadIdentity_()
    glClear_(#GL_DEPTH_BUFFER_BIT)
    glRotatef_(AngleX, 1, 0, 0)
    glRotatef_(AngleY, 0, 1, 0)
    glCallList_(SkyBoxList)
    SwapBuffers_(screen\hdc)
    glDepthMask_(#True)
    
  Until Event = #PB_Event_CloseWindow Or GetAsyncKeyState_(#VK_ESCAPE)

ReleaseDC_(screen\hWnd,screen\hDC)
Gruß
Scarabol

Verfasst: 07.02.2008 15:57
von Tibor
Hallo,

ich glaube nicht dass dies dein eigentliches Problem löst, aber wenn du mit Texturen arbeitest solltest du glClear_(#GL_DEPTH_BUFFER_BIT | #GL_COLOR_BUFFER_BIT) verwenden.

Verfasst: 07.02.2008 22:13
von Scarabol
Hi Leute,

danke an alle für die Hilfeversuche, aber gegen meine Dummheit kommt ihr leider nicht an :P

Ich bin gerade den Code zum x-ten mal durchgegangen und habe mich gewundert, wieso in der GenerateSkybox() Procedure einige Sachen auskommentiert sind und da fiel es wie Schuppen aus den Haaren....

In Delphi ist das Komma ein Befehlstrenner wie in PB der Doppelpunkt....

Naja funzt jetzt einwandfrei und nochmals vielen Dank für die Hilfe :D

Gruß
Scarabol

PS
Es darf gelacht werden....

Verfasst: 08.02.2008 14:11
von sechsrad
kannste den funktionierenden code mal reinstellen ?