Seite 1 von 1

Ein Bild in GL_QUADS von OGL reinsetzen?

Verfasst: 05.02.2015 10:27
von funkheld
Hallo, guten Tag.

Wie kann ich bitte ein BMP-Bild reinsetzen als Ersatz für das gelbe Quadrat in dieser Proc : Procedure DrawQuad()
Es wird als Ortho abgebildet.

Code: Alles auswählen

Global x.l,y.l,w.l,gadget.l

Declare DrawQuad() 
Declare SetupGL() 

Define *BMPHeader
Define *BMPImage
Define Direction.I
Define ImageHeight.I
Define ImageSize.I
Define ImageWidth.I
Define ImagePath.S
Define TextureID.I

#ImagePath = #PB_Compiler_Home + "examples/sources/Data/"

If ReadFile(0, #ImagePath + "Geebee2.bmp") = 0
  MessageRequester("Error", "Loading of texture image failed!")
  End
EndIf

*BMPHeader = AllocateMemory(54)
ReadData(0, *BMPHeader, MemorySize(*BMPHeader))
ImageWidth = PeekL(*BMPHeader + 18)
ImageHeight = PeekL(*BMPHeader + 22)
ImageSize = PeekL(*BMPHeader + 34)
FreeMemory(*BMPHeader)

*BMPImage = AllocateMemory(ImageSize)
ReadData(0, *BMPImage, ImageSize)
CloseFile(0)

OpenWindow(0, 0, 0, 800,600, "OpenGL Ortho", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

gadget=0
OpenGLGadget(0, 10, 10, 300,300)
SetGadgetAttribute(0, #PB_OpenGL_SetContext, #True)
SetupGL()

AddWindowTimer(0, 1, 16) ; about 60 fps

Repeat
  Event = WaitWindowEvent()
  
  Select Event
    Case #PB_Event_Timer
      If EventTimer() = 1 
        If x < 150
          x=x+1
          y=y+1
        EndIf  
        w=w+1
        
        DrawQuad()     
      EndIf
  EndSelect
  
Until Event = #PB_Event_CloseWindow

Procedure DrawQuad() 
  glClear_(#GL_COLOR_BUFFER_BIT) 
  glColor3ub_(255,255,0)
  
  glPushMatrix_()
  glTranslatef_(x,y,0.0)                    
  glRotatef_(w,0.0,0.0,1.0)
  
  glBegin_(#GL_QUADS)                            
  glVertex2f_(-50.0, 50.0)                    
  glVertex2f_( 50.0, 50.0)                  
  glVertex2f_( 50.0,-50.0)                    
  glVertex2f_(-50.0,-50.0)                    
  glEnd_() 
  glPopMatrix_()

  SetGadgetAttribute(Gadget, #PB_OpenGL_FlipBuffers, #True)
EndProcedure

Procedure SetupGL()   
  glDisable_(#GL_DEPTH_TEST)
  glDisable_(#GL_LIGHTING)
  
  glMatrixMode_(#GL_PROJECTION)
  glPushMatrix_() 
  glLoadIdentity_()
  glOrtho_(0,300,300,0,-1,1)
  
  glMatrixMode_(#GL_MODELVIEW)
  glPushMatrix_()
  glLoadIdentity_()
EndProcedure
Danke.

Gruss

Re: Ein Bild in GL_QUADS von OGL reinsetzen?

Verfasst: 05.02.2015 11:15
von STARGÅTE
Du musst das Bild als Texture in OpenGL einlanden und binden.

Hier ist denke ich ein gutes Tutorial:
https://open.gl/textures

Re: Ein Bild in GL_QUADS von OGL reinsetzen?

Verfasst: 05.02.2015 11:35
von funkheld
Danke für den Hinweis.

Ich habe es hier eingebunden, es erscheint aber nur ein lila Quadrat.

Code: Alles auswählen

Global x.l,y.l,w.l

Enumeration
  #window_1  
  #window_ogl  
  #file_0
EndEnumeration

Declare DrawQuad() 
Declare SetupGL() 

Define *BMPHeader
Define *BMPImage
Define Direction.I
Define ImageHeight.I
Define ImageSize.I
Define ImageWidth.I
Define ImagePath.S
Define TextureID.I

#ImagePath = #PB_Compiler_Home + "examples/sources/Data/"

If ReadFile(#file_0, #ImagePath + "Geebee2.bmp") = 0
  MessageRequester("Error", "Loading of texture image failed!")
  End
EndIf

*BMPHeader = AllocateMemory(54)
ReadData(#file_0, *BMPHeader, MemorySize(*BMPHeader))
ImageWidth = PeekL(*BMPHeader + 18)
ImageHeight = PeekL(*BMPHeader + 22)
ImageSize = PeekL(*BMPHeader + 34)
FreeMemory(*BMPHeader)

*BMPImage = AllocateMemory(ImageSize)
ReadData(#file_0, *BMPImage, ImageSize)
CloseFile(#file_0)

OpenWindow(#window_1 , 0, 0, 800,600, "OpenGL Ortho", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenGLGadget(#window_ogl , 10, 10, 300,300)

SetGadgetAttribute(#window_ogl  , #PB_OpenGL_SetContext, #True)
SetupGL()

glGenTextures_(1, @TextureID)
glBindTexture_(#GL_TEXTURE_2D, TextureID)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)
glTexImage2D_(#GL_TEXTURE_2D, 0, 3, ImageWidth, ImageHeight, 0, #GL_BGR_EXT, #GL_UNSIGNED_BYTE, *BMPImage)
FreeMemory(*BMPImage)

glEnable_(#GL_TEXTURE_2D)                             
glBindTexture_(#GL_TEXTURE_2D, TextureID)
glTexCoord2f_(1.0, 1.0)
glTexCoord2f_(0.0, 1.0)
glTexCoord2f_(0.0, 0.0) 
glTexCoord2f_(1.0, 0.0) 

AddWindowTimer(0, 1, 16) ; about 60 fps

Repeat
  Event = WaitWindowEvent()
  
  Select Event
    Case #PB_Event_Timer
      If EventTimer() = 1 
        If x < 150
          x=x+1
          y=y+1
        EndIf  
        w=w+1
        
        DrawQuad()     
      EndIf
  EndSelect
  
Until Event = #PB_Event_CloseWindow

Procedure DrawQuad() 
  glClear_(#GL_COLOR_BUFFER_BIT) 
  
  glPushMatrix_()
  glTranslatef_(150,150,0.0)            
  glBegin_(#GL_QUADS)                            
  glVertex2f_(-50.0, 50.0)                    
  glVertex2f_( 50.0, 50.0)                  
  glVertex2f_( 50.0,-50.0)                    
  glVertex2f_(-50.0,-50.0)                   
  glEnd_() 
  glPopMatrix_()

  SetGadgetAttribute(#window_ogl , #PB_OpenGL_FlipBuffers, #True)
EndProcedure

Procedure SetupGL()   
  glDisable_(#GL_DEPTH_TEST)
  glDisable_(#GL_LIGHTING)
  
  glMatrixMode_(#GL_PROJECTION)
  glPushMatrix_() 
  glLoadIdentity_()
  glOrtho_(0,300,300,0,-1,1)
  
  glMatrixMode_(#GL_MODELVIEW)
  glPushMatrix_()
  glLoadIdentity_()
  
EndProcedure

Re: Ein Bild in GL_QUADS von OGL reinsetzen?

Verfasst: 05.02.2015 12:17
von alter Mann
Du musst die Texturkoordinaten den Punktkoordinaten zuordnen.

Code: Alles auswählen

  glBegin_(#GL_QUADS)                            
  
  glTexCoord2f_(0.0, 1.0)
  glVertex2f_(-50.0, 50.0)                    
  glTexCoord2f_(1.0, 1.0)
  glVertex2f_( 50.0, 50.0)                  
  
  glTexCoord2f_(1.0, 0.0) 
  glVertex2f_( 50.0,-50.0)                    
  
  glTexCoord2f_(0.0, 0.0) 
  glVertex2f_(-50.0,-50.0)                   
  glEnd_() 

Re: Ein Bild in GL_QUADS von OGL reinsetzen?

Verfasst: 05.02.2015 13:02
von funkheld
Ja danke, das habe ich nicht gemacht mit der Zuordnung.
Jetzt erscheint das Bild.
Wie kann das Bild jetzt bei der Farbe Lila RGB(255,0,255) durchsichtig gemacht werden?

Danke.

Gruss

Re: Ein Bild in GL_QUADS von OGL reinsetzen?

Verfasst: 05.02.2015 23:37
von alter Mann
Dazu musst du das Bild in das 32-Bit-Format umschreiben und das Blending einschalten.
Ich habe da mal vorbereitet :mrgreen:

Code: Alles auswählen

Global x.l,y.l,w.l

Enumeration
  #window_1 
  #window_ogl 
  #file_0
EndEnumeration

Declare DrawQuad()
Declare SetupGL()

Define *BMPHeader
Define *BMPImage
Define *RGBAImage
Define Direction.I
Define ImageHeight.I
Define ImageSize.I
Define ImageWidth.I
Define ImagePath.S
Define TextureID.I
Define BytesPerPixel.i

Structure FARBERGBA
  b.b 
  g.b 
  r.b 
  a.b 
EndStructure 

Structure FARBERGB
  b.b 
  g.b 
  r.b 
EndStructure 

Define *Pixel1.FARBERGB
Define *Pixel2.FARBERGBA
Define i.i

#ImagePath = #PB_Compiler_Home + "examples/sources/Data/"

If ReadFile(#file_0, #ImagePath + "Geebee2.bmp") = 0
  MessageRequester("Error", "Loading of texture image failed!")
  End
EndIf

*BMPHeader = AllocateMemory(54)
ReadData(#file_0, *BMPHeader, MemorySize(*BMPHeader))
ImageWidth = PeekL(*BMPHeader + 18)
ImageHeight = PeekL(*BMPHeader + 22)
ImageSize = PeekL(*BMPHeader + 34)
FreeMemory(*BMPHeader)

*BMPImage = AllocateMemory(ImageSize)
ReadData(#file_0, *BMPImage, ImageSize)
CloseFile(#file_0)

BytesPerPixel = ImageSize/(ImageWidth*ImageHeight)
If BytesPerPixel = 3 
  *RGBAImage = AllocateMemory(ImageSize*4)
  *Pixel1 = *BMPImage
  *Pixel2 = *RGBAImage
  For i = 0 To ImageWidth*ImageHeight
    *Pixel2\r = *Pixel1\r
    *Pixel2\g = *Pixel1\g
    *Pixel2\b = *Pixel1\b
    If *Pixel1\r = -1 And *Pixel1\b = -1
      *Pixel2\a = 0
      *Pixel2\r = 0
      *Pixel2\g = 0
      *Pixel2\b = 0
    Else
      *Pixel2\a = -1
    EndIf
    *Pixel1 + SizeOf(FARBERGB)
    *Pixel2 + SizeOf(FARBERGBA)
  Next i
  FreeMemory(*BMPImage)
  *BMPImage = *RGBAImage
EndIf

OpenWindow(#window_1 , 0, 0, 800,600, "OpenGL Ortho", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenGLGadget(#window_ogl , 10, 10, 300,300)

SetGadgetAttribute(#window_ogl  , #PB_OpenGL_SetContext, #True)
SetupGL()

glEnable_(#GL_BLEND)
glGenTextures_(1, @TextureID)
glBindTexture_(#GL_TEXTURE_2D, TextureID)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)
glTexImage2D_(#GL_TEXTURE_2D, 0, 3, ImageWidth, ImageHeight, 0, #GL_BGRA_EXT, #GL_UNSIGNED_BYTE, *BMPImage)
FreeMemory(*BMPImage)

glEnable_(#GL_TEXTURE_2D) 
glBindTexture_(#GL_TEXTURE_2D, TextureID)

AddWindowTimer(0, 1, 16) ; about 60 fps

Repeat
  Event = WaitWindowEvent()
 
  Select Event
    Case #PB_Event_Timer
      If EventTimer() = 1
        If x < 150
          x=x+1
          y=y+1
        EndIf 
        w=w+1
       
        DrawQuad()     
      EndIf
  EndSelect
 
Until Event = #PB_Event_CloseWindow

Procedure DrawQuad()
  glClear_(#GL_COLOR_BUFFER_BIT)
 
  glPushMatrix_()
  glTranslatef_(150,150,0.0)           
  glBegin_(#GL_QUADS)                           
  glTexCoord2f_(0.0, 1.0)
  glVertex2f_(-50.0, 50.0)                   
  glTexCoord2f_(1.0, 1.0)
  glVertex2f_( 50.0, 50.0)                 
  glTexCoord2f_(1.0, 0.0)
  glVertex2f_( 50.0,-50.0)                   
  glTexCoord2f_(0.0, 0.0)
  glVertex2f_(-50.0,-50.0)            
  glEnd_()
  glPopMatrix_()

  SetGadgetAttribute(#window_ogl , #PB_OpenGL_FlipBuffers, #True)
EndProcedure

Procedure SetupGL()   
  glDisable_(#GL_DEPTH_TEST)
  glDisable_(#GL_LIGHTING)
 
  glMatrixMode_(#GL_PROJECTION)
  glPushMatrix_()
  glLoadIdentity_()
  glOrtho_(0,300,300,0,-1,1)
 
  glMatrixMode_(#GL_MODELVIEW)
  glPushMatrix_()
  glLoadIdentity_()
 
EndProcedure

Re: Ein Bild in GL_QUADS von OGL reinsetzen?

Verfasst: 06.02.2015 13:36
von funkheld
Ja, vielen Dank.

Ich wusste nicht, das es so ein Aufwand ist.

Danke.
Gruss

Re: Ein Bild in GL_QUADS von OGL reinsetzen?

Verfasst: 06.02.2015 13:44
von NicTheQuick
Ich kenne mich damit nicht aus, aber man kann man bestimmt auch von Anfang einfach ein 32-Bit-Bild laden mit Alpha-Kanal. Damit kann man dann auch weichere Übergänge machen als mit einer Farbe, die die Transparenz darstellen soll.

Re: Ein Bild in GL_QUADS von OGL reinsetzen?

Verfasst: 07.02.2015 18:26
von funkheld
Hmmm..., da muss immer eine Fläche(Vertexe) vorhanden sein, wo das Bild drauf kommt.

Gruss