Ein Bild in GL_QUADS von OGL reinsetzen?

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
funkheld
Beiträge: 636
Registriert: 31.12.2009 11:58

Ein Bild in GL_QUADS von OGL reinsetzen?

Beitrag 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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Ein Bild in GL_QUADS von OGL reinsetzen?

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
funkheld
Beiträge: 636
Registriert: 31.12.2009 11:58

Re: Ein Bild in GL_QUADS von OGL reinsetzen?

Beitrag 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
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Re: Ein Bild in GL_QUADS von OGL reinsetzen?

Beitrag 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_() 
Win11 64Bit / PB 6.0
funkheld
Beiträge: 636
Registriert: 31.12.2009 11:58

Re: Ein Bild in GL_QUADS von OGL reinsetzen?

Beitrag 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
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Re: Ein Bild in GL_QUADS von OGL reinsetzen?

Beitrag 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
Win11 64Bit / PB 6.0
funkheld
Beiträge: 636
Registriert: 31.12.2009 11:58

Re: Ein Bild in GL_QUADS von OGL reinsetzen?

Beitrag von funkheld »

Ja, vielen Dank.

Ich wusste nicht, das es so ein Aufwand ist.

Danke.
Gruss
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8677
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Ein Bild in GL_QUADS von OGL reinsetzen?

Beitrag 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.
Bild
funkheld
Beiträge: 636
Registriert: 31.12.2009 11:58

Re: Ein Bild in GL_QUADS von OGL reinsetzen?

Beitrag von funkheld »

Hmmm..., da muss immer eine Fläche(Vertexe) vorhanden sein, wo das Bild drauf kommt.

Gruss
Antworten