Hierfür Yo una Weile gebraucht, como lo no Dokumentationen para el Funktionsumfang de OpenGL en XProfan son. Yo bin dran, auch Zugriff en akuellere OpenGL Características a obtener, a dahin aber hier el oldschool Ejemplo
Normalerweise löst al Rendern en una Textur por glBindFramebuffer, Yo gehe el Umweg encima glReadPixels y weise el en cada Frame el Textur a.
Um con dieser Technik Szenen a spiegeln como z.B. en uno Wasseroberfläche bräuchte lo después de mi Verständnis folgendes: Kamera en gleichem Abstand y umgekehrten Winkel bajo el spiegelnde Oberfläche, Textur como Projektion - letzteres Yo incluso todavía no korrekt hinbekommen.
Declarar tex&[5]
Declarar xrot!, yrot!, zrot!, xpos!, ypos!, zpos!,xsrot!,ysrot!,zsrot!,xspos!,yspos!,zspos!
Declarar smooth%,mb&,mousestartx%,mousestarty%,mousex%,mousey%
Declarar ende%,hPic&
Declarar x&, y&, bytes&,mem#,size&,mem&,light#,t&,fps&,mod&
Proc MouseKeyboard
mousex% = %MouseX
mousey% = %MouseY
if mb& = 0
caso isKey(1) : mb& = 1
caso isKey(2) : mb& = 2
endif
if (not(isKey(2)) & not(isKey(1)))
'Startposition fürs rotieren y Zoomwen otra vez nullen
mb& = 0
mousestartx% = %mousex
mousestarty% = %mousey
xsrot! = xrot!
ysrot! = yrot!
zspos! = zpos!
endif
'Tastaturrotation
caso isKey(37) : yrot! = yrot! - 1.0
caso isKey(39) : yrot! = yrot! + 1.0
caso isKey(38) : xrot! = xrot! + 1.0
caso isKey(40) : xrot! = xrot! - 1.0
'Mausrotation
if (mb& = 1)
yrot! = ysrot! - (mousestartx% - %mousex) * 0.4
xrot! = xsrot! - (mousestarty% - %mousey) * 0.4
endif
'Mauszoom
if (mb& = 2) & (abs(mousestarty% - %mousey) > 10)
zpos! = zspos! + (mousestarty% - %mousey) * 0.03
endif
'Sonstige Tastatureingaben
caso IsKey(27) : Ende% = 1
ENDPROC
declarar txID&
Proc DrawGLScene
'Szene para Textur rendern (roter Würfel)
oGL("glClearColor",1.0,1.0,0.0,1.0)
oGL("glClear", ~GL_COLOR_BUFFER_BIT | ~GL_DEPTH_BUFFER_BIT)
ogl("Origin",0,0,-0.2)'Objetos el Größe "1" son hier exakt así hoch como el Viewport
oGL("Move", xpos!, ypos!, zpos!)
oGL("Rotate", xrot!,yrot!,zrot!)
oGL("Texture",0, 1)
oGL("Color", 1,0,0,1)
ogl("Cuboid",2,2,2)
'Screenshot en Speicher legen
oGL("glReadPixels", 210,20,520,520,~GL_RGB,~GL_UNSIGNED_BYTE,mem#)
'Textur redactar, de Perfomancegründen, keinesfalls Mipmaps
ogl("glBindTexture",~GL_TEXTURE_2D,txID&)
ogl("glTexEnvi",~GL_TEXTURE_ENV, ~GL_TEXTURE_ENV_MODE, ~GL_MODULATE)
ogl("glTexImage2D",~GL_TEXTURE_2D,0,~GL_RGBA,520, 520,0,~GL_RGB,~GL_UNSIGNED_BYTE,mem#)
ogl("glTexParameteri",~GL_TEXTURE_2D, ~GL_TEXTURE_MAG_FILTER, ~GL_LINEAR)
ogl("glTexParameteri",~GL_TEXTURE_2D, ~GL_TEXTURE_MIN_FILTER, ~GL_LINEAR)
'Sichtbare Szene rendern y Mostrar
oGL("glClearColor",1.0,1.0,1.0,1.0)
oGL("glClear", ~GL_COLOR_BUFFER_BIT | ~GL_DEPTH_BUFFER_BIT)
oGL("Texture",txID&, 1)
oGL("Color", 1,1,1,1)
ogl("Cuboid",2,2,2)
oGL("Show")
ENDPROC
' Hauptprogramm
' -------------
windowstyle 1+2+4+8+16
windowtitle "render to texture"
window (%maxx * 0.5 -480), (%maxy * 0.5 - 300) - 960,600'kompatible Schreibweise
UseIcon "Gesicht"
Dim mem#, 520*520*3'x * y * bpp
'oGL iitialisieren, Textur preparar
oGL("Init", %hWnd, 1,1,1,1)
oGL("PosMode",1)
oGL("glEnable", ~GL_CULL_FACE)
ogl("glGenTextures",1,addr(txID&))
'Etwas mehr Licht!
dim light#,16
long light#,0 = single(0.5),single(0.5),single(0.5),single(1.0)
oGL("glLightfv",~GL_LIGHT0 ,~GL_AMBIENT,light#)'GL_AMBIENT
'Startposition
zpos! = -5
xrot! = 0
yrot! = 0
Sinestar encargado ende%
MouseKeyboard()
DrawGLScene()
EndWhile
oGL("Done")
End
|