1. Frage:
Wie bekomme ich die richtigen Farben bei einer OpenGL-Textur ?
2. Frage:
Wie könnte man am besten Text in OpenGL darstellen ?
Ein Bild als Text-Textur zu verwenden wäre eine Lösung, aber gibt es bessere ?
Hier mal ein kleines Beispiel:
Code: Alles auswählen
; ImportC "-lglut"
; glutBitmapCharacter(font, character)
; EndImport
UsePNGImageDecoder()
UseJPEGImageDecoder()
#IMG_24 = 0
#IMG_32 = 1
#GL_CLAMP_TO_EDGE=$812F
Global GTex.i
Global img_w.i, img_h.i
Procedure glDraw3DColor(col)
Protected r.f, g.f, b.f
r = (1 / 255 * Red(col))
g = (1 / 255 * Green(col))
b = (1 / 255 * Blue(col))
glColor3f_(r,g,b)
EndProcedure
Procedure glClear()
glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
EndProcedure
Procedure glDraw3DPoint(x.f,y.f,z.f)
glPushMatrix_()
glMatrixMode_(#GL_MODELVIEW)
glBegin_(#GL_POINTS)
glVertex3f_(x,y,z)
glEnd_()
glPopMatrix_()
glFinish_()
EndProcedure
Procedure glDraw3DLine(x1.f,y1.f,z1.f,x2.f,y2.f,z2.f)
glPushMatrix_()
glMatrixMode_(#GL_MODELVIEW)
glBegin_(#GL_LINE_STRIP)
glVertex3f_(x1,y1,z1)
glVertex3f_(x2,y2,z2)
glEnd_()
glPopMatrix_()
glFinish_()
EndProcedure
Procedure glDraw3DBox(x1.f,y1.f,z1.f,w.f,h.f,flag.b=#False)
glPushMatrix_()
glMatrixMode_(#GL_MODELVIEW)
If flag = #True
;FILLED
glBegin_(#GL_QUADS)
glVertex3f_(x1,y1,z1)
glVertex3f_(x1+w,y1,z1)
glVertex3f_(x1+w,y1+h,z1)
glVertex3f_(x1,y1+h,z1)
glEnd_()
ElseIf flag = #False
;UNFILLED
glBegin_(#GL_LINE_LOOP)
glVertex3f_(x1,y1,z1)
glVertex3f_(x1+w,y1,z1)
glVertex3f_(x1+w,y1+h,z1)
glVertex3f_(x1,y1+h,z1)
glVertex3f_(x1,y1,z1)
glEnd_()
EndIf
glPopMatrix_()
glFinish_()
EndProcedure
Procedure glDraw3DEllipse(x.f,y.f,z.f,rx.f,ry.f,flag.b=#False)
Protected i=0, n
If rx > ry
n = rx*10
Else
n = ry*10
EndIf
glPushMatrix_()
glMatrixMode_(#GL_MODELVIEW)
If flag = #True
;FILLED
glBegin_(#GL_POLYGON)
For i = 0 To n
glVertex3f_(rx * Cos(i) + x, ry * Sin(i) + y, z)
Next i
glEnd_()
ElseIf flag = #False
;UNFILLED
glBegin_(#GL_POINTS)
For i = 0 To n
glVertex3f_(rx * Cos(i) + x, ry * Sin(i) + y, z)
Next i
glEnd_()
EndIf
glPopMatrix_()
glFinish_()
EndProcedure
Procedure glDraw3DTriangle(x1.f,y1.f,z1.f,x2.f,y2.f,z2.f,x3.f,y3.f,z3.f,flag.b=#False)
glPushMatrix_()
glMatrixMode_(#GL_MODELVIEW)
If flag = #True
;FILLED
glBegin_(#GL_TRIANGLES)
glVertex3f_(x1,y1,z1)
glVertex3f_(x2,y2,z2)
glVertex3f_(x3,y3,z3)
glEnd_()
ElseIf flag = #False
;UNFILLED
glBegin_(#GL_LINE_LOOP)
glVertex3f_(x1,y1,z1)
glVertex3f_(x1+w,y1,z1)
glVertex3f_(x1+w,y1+h,z1)
glVertex3f_(x1,y1+h,z1)
glVertex3f_(x1,y1,z1)
glEnd_()
EndIf
glPopMatrix_()
glFinish_()
EndProcedure
Procedure glDraw3DArc(x.f,y.f,r.f,startAngle.f,drawAngle.f,z.f)
Protected n = r*10, i = 0
Protected ta.f = Radian(-drawAngle) / (n-1)
Protected tf.f = Tan(ta)
Protected rf.f = Cos(ta)
Protected xx.f = r * Cos(Radian(-startAngle))
Protected yy.f = r * Sin(Radian(-startAngle))
Protected tx.f, ty.f
glPushMatrix_()
glMatrixMode_(#GL_MODELVIEW)
glBegin_(#GL_POINTS)
For i = 0 To n
glVertex3f_(xx + x, yy + y, z)
tx = -yy
ty = xx
xx + tx * tf
yy + ty * tf
xx * rf
yy * rf
Next i
glEnd_()
glPopMatrix_()
glFinish_()
EndProcedure
Procedure.i glCreateImage(ImageID.i,Type.i)
;Protected.i img_w, img_h
Protected.i MemID, TexID
If IsImage(ImageID) = 0
ProcedureReturn #False
EndIf
glGenTextures_(1, @TexID)
glBindTexture_(#GL_TEXTURE_2D, TexID)
If StartDrawing(ImageOutput(ImageID))
MemID = DrawingBuffer()
StopDrawing()
EndIf
If MemID = 0
ProcedureReturn #False
EndIf
img_w = ImageWidth(ImageID)
img_h = ImageHeight(ImageID)
If Type = 1
glTexImage2D_(#GL_TEXTURE_2D, 0, 4, img_w, img_h, 0, #GL_RGBA, #GL_UNSIGNED_BYTE, MemID)
Else
glTexImage2D_(#GL_TEXTURE_2D, 0, #GL_RGBA, img_w, img_h, 0, #GL_RGB, #GL_UNSIGNED_BYTE, MemID)
EndIf
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)
; glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_WRAP_S, #GL_CLAMP_TO_EDGE)
; glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_WRAP_T, #GL_CLAMP_TO_EDGE)
ProcedureReturn TexID
EndProcedure
Procedure glDraw3DImage(x.f,y.f,z.f,TexID.i)
glPushMatrix_()
glMatrixMode_(#GL_MODELVIEW)
glBindTexture_(#GL_TEXTURE_2D, TexID)
glEnable_(#GL_TEXTURE_2D)
glBegin_(#GL_POLYGON)
glTexCoord3f_(0,0,z)
glVertex3f_(x,y,z)
glTexCoord3f_(1,0,z)
glVertex3f_(x+img_w,y,z)
glTexCoord3f_(1,1,z)
glVertex3f_(x+img_w,y+img_h,z)
glTexCoord3f_(0,1,z)
glVertex3f_(x,y+img_h,z)
glEnd_()
glDisable_(#GL_TEXTURE_2D)
glBindTexture_(#GL_TEXTURE_2D, 0)
;glFlush_()
glPopMatrix_()
glFinish_()
EndProcedure
Procedure glDraw3DText(x.f,y.f,z.f,text.s) ;TODO
If text=""
ProcedureReturn #False
EndIf
glRasterPos3f_(x,y,z)
EndProcedure
Procedure glRender()
SetGadgetAttribute(GadgetHandle, #PB_OpenGL_SetContext, #True)
;glDisable_(#GL_LIGHTING)
glClear()
glDraw3DColor(RGB(255,255,0))
glDraw3DText(0,20,0,"Hallo!") ;TODO
For t = 0 To 100
glDraw3DPoint(600+t,200,0)
Next t
glDraw3DLine(5,300,0,795,300,0)
glDraw3DColor(RGB(255,0,255))
glDraw3DBox(300,40,0,200,200,1)
glDraw3DColor(RGB(255,0,0))
glDraw3DEllipse(400,400,2,40,40,0)
glDraw3DTriangle(10,200,0,200,200,0,105,100,0,1)
glDraw3DArc(100, 500, 90, 0, 270, 0)
glDraw3DColor(RGB(255,255,0))
glDraw3DImage(300,320,0,GTex)
;glDraw3DBox(300,320,1,128,128,1)
glFinish_()
SetGadgetAttribute(0, #PB_OpenGL_FlipBuffers, #True)
EndProcedure
Procedure glInit()
;glMatrixMode_(#GL_MODELVIEW)
glOrtho_(0.0, WindowWidth(0), WindowHeight(0), 0.0, -10.0, 10.0)
glEnable_(#GL_SMOOTH)
glEnable_(#GL_DEPTH_TEST)
glEnable_(#GL_TEXTURE_2D)
;glPolygonMode_(#GL_FRONT_AND_BACK, #GL_LINE_SMOOTH)
glViewport_(0, 0, WindowWidth(0), WindowHeight(0))
EndProcedure
Procedure glError(Result, Text$)
If Result = 0
MessageRequester("Error", Text$, 0)
End
EndIf
EndProcedure
CreateImage(0, 128, 128, 24)
StartDrawing(ImageOutput(0))
Box(0, 0, 64, 64, RGB(255,0,0))
Box(64, 0, 64, 64, RGB(0,255,0))
Box(0, 64, 64, 64, RGB(0,255,255))
Box(64, 64, 64, 64, RGB(255,255,255))
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(10, 100, "Wrong Color", RGB(0,0,0))
StopDrawing()
OpenWindow(0, 0, 0, 800, 600, "OpenGL - Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered |#PB_Window_SizeGadget | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
OpenGLGadget(0, 0, 0, WindowWidth(0), WindowHeight(0))
glInit()
GTex = glCreateImage(0,#IMG_24)
AddWindowTimer(0, 1, 16)
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_SizeWindow
ResizeGadget(0, #Null, #Null, WindowWidth(0), WindowHeight(0))
Case #PB_Event_Timer
If EventTimer() = 1
glRender()
EndIf
EndSelect
Until Event = #PB_Event_CloseWindow