Hier wird das Bild in einem Datenspeicher eingelesen vom Openglfenster:
glReadBuffer_(#GL_FRONT)
glReadPixels_(0,0,127,127,#GL_RGB,#GL_UNSIGNED_BYTE,@lpBuffer())
SetDIBits_(hdc,hbmImage,0,128,lpBuffer,bmi,#DIB_RGB_COLORS)
Aber irgendwo ist da noch ein Fehler, weil das Bild rechts nicht dargestellt wird.
Wer kann mir weiterhelfen.
Danke.
mfg
peter
Code: Alles auswählen
XIncludeFile "opengl.pbi"
Global xx.f,yy.f,zz.f,scale.f,winkel.f
Structure GLscreen
container.l
hWnd.l
hDC.l
EndStructure
Procedure createdraw()
;DrawingMode(#PB_2DDrawing_Outlined)
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,"TEXT")
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.l = 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,xx,yy,ww,hh)
If *p
container = ContainerGadget(#PB_Any,xx,yy,ww,hh)
If container
hwnd = GadgetID(container)
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 = GadgetID(container)
*p\hDC = hdc
glMatrixMode_(#GL_PROJECTION)
gluPerspective_(45, 1, 1,100.0)
glMatrixMode_(#GL_MODELVIEW)
glEnable_(#GL_TEXTURE_2D)
glEnable_(#GL_ALPHA_TEST)
glAlphaFunc_(#GL_GREATER, 0.0)
ProcedureReturn 1
EndIf
EndIf
EndProcedure
OpenWindow(0, 300, 10, 520,520, "test1")
OpenGLScreen(screen.GLscreen,10,10,128,128)
Global Texture_1 = GLLoadAlphaTexture(1,"image","auto.bmp",1,0)
glClearColor_(1.0, 0.0, 1.0, 1.0)
scale=1
zz=-1.5
Global hbmImage = ImageID(0)
Dim lpBuffer(128*128 * 4)
Repeat
glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT | #GL_STENCIL_BUFFER_BIT)
glLoadIdentity_()
glTranslatef_(0.0,0.0,zz)
glRotatef_(-winkel+90,0.0,0.0,1.0)
glScalef_(scale,scale,scale)
glBindTexture_(#GL_TEXTURE_2D, Texture_1)
glBegin_(#GL_QUADS)
glTexCoord2f_(0.0, 1.0) : glVertex3f_(-0.5, 0.5, 0.0)
glTexCoord2f_(1.0, 1.0) : glVertex3f_( 0.5, 0.5, 0.0)
glTexCoord2f_(1.0, 0.0) : glVertex3f_( 0.5, -0.5, 0.0)
glTexCoord2f_(0.0, 0.0) : glVertex3f_(-0.5, -0.5, 0.0)
glEnd_()
SwapBuffers_(screen\hdc)
glReadBuffer_(#GL_FRONT)
glReadPixels_(0,0,127,127,#GL_RGB,#GL_UNSIGNED_BYTE,@lpBuffer())
SetDIBits_(hdc,hbmImage,0,128,lpBuffer,bmi,#DIB_RGB_COLORS)
StartDrawing(WindowOutput(0))
DrawImage(ImageID(0),200,10)
StopDrawing()
Event = WaitWindowEvent()
WindowID = EventWindow()
GadgetID = EventGadget()
EventType = EventType()
If GetAsyncKeyState_(#VK_Q)
winkel=winkel+0.1
ElseIf GetAsyncKeyState_(#VK_E)
winkel=winkel-0.1
EndIf
If GetAsyncKeyState_(#VK_W)
zz=zz+0.001
If zz>-1.0
zz=-1.0
EndIf
ElseIf GetAsyncKeyState_(#VK_S)
zz=zz-0.001
EndIf
Until Event = #PB_Event_CloseWindow
ReleaseDC_(screen\hWnd,screen\hDC)