Delphi Funktionsaufruf - OpenGl Tut Terrain [gelöst]

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Delphi Funktionsaufruf - OpenGl Tut Terrain [gelöst]

Beitrag 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
Zuletzt geändert von Scarabol am 08.02.2008 17:05, insgesamt 4-mal geändert.
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag von milan1612 »

Das sind meiner Meinung nach Methoden der Klasse TGLBmp :wink:
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag 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
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag 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
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
Susi55
Beiträge: 12
Registriert: 10.12.2006 15:49
Wohnort: Hamburg

Beitrag 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.
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Du vergisst leider das die Klasse die Texturen noch verändert siehe SetTexture und GenTexture. Oder kann ich das ignorieren?

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag 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
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Tibor
Beiträge: 42
Registriert: 29.08.2004 03:25
Wohnort: Mittelerde, südlich der großen Grasplantagen

Beitrag 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.
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag 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....
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
sechsrad
Rüpel
Beiträge: 112
Registriert: 01.02.2008 13:31

Beitrag von sechsrad »

kannste den funktionierenden code mal reinstellen ?
Antworten