Deutsch
Quelltexte/ Codesnippets

OpenGL Render-To-Texture

 

Sven
Bader


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

42 kB
Bezeichnung:render2texture
Hochgeladen:03.09.2021
Ladeanzahl72
Herunterladen
 
03.09.2021  
 



Zum Quelltext


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

1.451 Betrachtungen

Unbenanntvor 0 min.
H.Brill29.10.2023
Sven Bader01.02.2023
Ernst29.05.2022
p.specht18.11.2021
Mehr...

Themeninformationen

Dieses Thema hat 1 Teilnehmer:

Sven Bader (1x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


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