Hierfür habe ich eine Weile gebraucht, da es keine Dokumentationen für den Funktionsumfang von OpenGL in XProfan gibt. Ich bin dran, auch Zugriff auf akuellere OpenGL Funktionen zu erhalten, bis dahin aber hier das oldschool Beispiel
Normalerweise löst man das Rendern auf eine Textur per glBindFramebuffer, ich gehe den Umweg über glReadPixels und weise die in jedem Frame der Textur zu.
Um mit dieser Technik Szenen zu spiegeln wie z.B. auf einer Wasseroberfläche bräuchte es nach meinem Verständnis folgendes: Kamera in gleichem Abstand und umgekehrten Winkel unter die spiegelnde Oberfläche, Textur als Projektion - letzteres habe ich selbst noch nicht korrekt hinbekommen.
Declare tex&[5]
Declare xrot!, yrot!, zrot!, xpos!, ypos!, zpos!,xsrot!,ysrot!,zsrot!,xspos!,yspos!,zspos!
Declare smooth%,mb&,mousestartx%,mousestarty%,mousex%,mousey%
Declare ende%,hPic&
Declare x&, y&, bytes&,mem#,size&,mem&,light#,t&,fps&,mod&
Proc MouseKeyboard
mousex% = %MouseX
mousey% = %MouseY
if mb& = 0
case isKey(1) : mb& = 1
case isKey(2) : mb& = 2
endif
if (not(isKey(2)) & not(isKey(1)))
'Startposition fürs rotieren und Zoomwen wieder nullen
mb& = 0
mousestartx% = %mousex
mousestarty% = %mousey
xsrot! = xrot!
ysrot! = yrot!
zspos! = zpos!
endif
'Tastaturrotation
case isKey(37) : yrot! = yrot! - 1.0
case isKey(39) : yrot! = yrot! + 1.0
case isKey(38) : xrot! = xrot! + 1.0
case 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
case IsKey(27) : Ende% = 1
Endproc
declare txID&
Proc DrawGLScene
'Szene für 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)'Objekte der Größe "1" sind hier exakt so hoch wie der 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 in Speicher legen
oGL("glReadPixels", 210,20,520,520,~GL_RGB,~GL_UNSIGNED_BYTE,mem#)
'Textur erstellen, aus 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 und anzeigen
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 vorbereiten
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
WhileNot ende%
MouseKeyboard()
DrawGLScene()
EndWhile
oGL("Done")
End
|