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
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