Italia
Fonte/ Codesnippets

OpenGL Render-To-Texture

 

Sven
Bader


Hierfür habe ich eine Weile gebraucht, da es keine Dokumentationen per 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 circa 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 per 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 Dimensione "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 Mostra
    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

42 kB
Bezeichnung:render2texture
Hochgeladen:03.09.2021
Downloadcounter72
Download
 
03.09.2021  
 



Zum Quelltext


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

1.450 Views

Untitledvor 0 min.
H.Brill29.10.2023
Sven Bader01.02.2023
Ernst29.05.2022
p.specht18.11.2021
Di più...

Themeninformationen

Dieses Thema hat 1 subscriber:

Sven Bader (1x)


Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie