Um Eigenschaften et Positionierung de Licht dans OpenGL trop comprendre, musste je es mir seulement visualisieren. cela Ergebnis teile je volontiers avec euch.
il y a un paire API Aufrufe dabei, c'est mais alles très überschaubar gehalten.
mon Top 3 Learnings étions: - Glanzlichter sommes doch gar pas so schwer - Platzierung de Licht ist unbeeindruckt de Pushs et Pops - qui Lichtgenauigkeit ist direct de qui Dreiecksanzahl dépendant
$H OpenGL.ph
declare time&, frames%
declare rtri!, light#
declare white#,red#, green#,blue#, zero#, list&,loop&
dim light#,16
dim white#,16
dim red#,16
dim green#,16
dim blue#,16
dim zero#,16
FloatArray(white#,1,1,1,1)
FloatArray(red#,1,0,0,1)
FloatArray(green#,0,1,0,1)
FloatArray(blue#,0,0,1,1)
FloatArray(zero#,0,0,0,1)
FloatArray(light#,-0.05,-0.05,-0.05, 1.0)
PROC GRID
'il y a bessere Opportunités, Gitter trop erstellen mais pour cet Beispiel reicht es, un einzelner Quad serait
'pas vernünftig beleuchtet volonté (siehe Würfel) "per-vertex lighting"
parameters size!, resolution!
si list& = 0
list& = ogl("StartList")
oGL("Move", -(size! * 0.5)-(size! / resolution! * 0.5),(size! * 0.5)-(size! / resolution! * 0.5), 0)
whileloop 1, int(resolution!)
oGL("Move", (size! / resolution!),-size!, 0)
loop& = &loop
whileloop 1, int(resolution!)
si ((&loop + loop&) MOD 2) = 0
oGL("Color", 0.2,0.2,0.2,1.0)
d'autre
oGL("Color", 1.0,1.0,1.0,1.0)
endif
oGL("Move", 0.0, (size! / resolution!), 0)
oGL("Quad", (size! / resolution!),(size! / resolution!))
endwhile
endwhile
ogl("EndList")
endif
ogl("Drawlist", list&)
ENDPROC
Proc Light
'Zur besseren Veranschaulichung dans Proc gekapselt, si es um Performance allez nimmt on une fertigen Bereich,
'définition de allem aus Position serait aussi einmal chez initialisation reichen, cela objet dient qui Visualisierung
'qui Lichtposition. cela Grundlicht (Ambient) ist léger négative gesetzt là es aus irgendeinem Grund chez "0" et avec ca
'Licht gibt
parameters no&, r!, g!, b!
declare color#
dim color#, 16
FloatArray(color#,r!, g!, b!, 1.0)
oGL("glMaterialfv", ~GL_FRONT_AND_BACK, ~GL_EMISSION, color#)
oGL("Color", r!, g!, b!, 1.0)
oGL("Cuboid", 0.15, 0.15, 0.15)
oGL("glMaterialfv", ~GL_FRONT_AND_BACK, ~GL_EMISSION, zero#)
oGL("glLightfv",~GL_LIGHT0 + no&,~GL_AMBIENT,light#)'GL_AMBIENT
oGL("glLightfv",~GL_LIGHT0 + no&,~GL_DIFFUSE, color#)' GL_DIFFUSE
oGL("glLightfv",~GL_LIGHT0 + no&,~GL_POSITION,zero#)' GL_POSITION
oGL("glLightfv",~GL_LIGHT0 + no&,~GL_SPECULAR, white#)' GL_SPECULAR
oGL("glEnable",~GL_LIGHT0 + no&)
dispose color#
ENDPROC
proc DrawGLScene
oGL("Clear")
oGL("Move", 0, 0.75, -5.0)
oGL("glMaterialfv",~GL_FRONT_AND_BACK, ~GL_SPECULAR, white#)' Glanzlichtfarbe
oGL("glMaterialf", ~GL_FRONT_AND_BACK, ~GL_SHININESS,128.0)' Glanzlichtgröße (grand numéro ist kleiner, max 128.0)
oGL("glDisable",~GL_LIGHT0)'Default Licht aus
'-------
'Lichtpositionen laisser sich pas par Push/Pop kapseln!
'Jegliche Positionierung muss alors après wieder negiert volonté, chez Rotationen achsenweise
'et alles toujours dans umgekehrter Reihenfolge - une Aufnahme en dans qui Light()-Funktion wäre imaginable
'LICHTER
oGL("Rotate",0,0, rtri!)
oGL("Move", 2.0, 0,0)
'Light(Lichtnummer, rouge, vert, bleu)
Light(1,1,0,0)' rouge
oGL("Move", -2.0, 0,0)
oGL("Rotate", 0,0,-rtri!)
oGL("Rotate",0,90,0)
oGL("Rotate",0,0, rtri!)
oGL("Move", 2.0, 0,0)
Light(2,0,1,0)' vert
oGL("Move", -2.0, 0,0)
oGL("Rotate", 0,0,-rtri!)
oGL("Rotate", 0,-90,0)
oGL("Rotate", 0, rtri!,0)
oGL("Move", 2.5, 0,0)
Light(3,0,0,1)' bleu
oGL("Move", -2.5, 0,0)
oGL("Rotate", 0, -rtri!,0)
'OBJEKTE
oGL("Color", 1, 1, 1, 1)
'quelque chose dans qui vers herumschauen:
oGL("Rotate",sin(rtri!*0.01) * 10.0, sin(rtri!*0.01) * 20.0, sin(rtri!*0.01) * 5.0)
oGL("Push")'Boden
oGL("Move", 0, -2.2, -4)
oGL("Rotate",270, 0,0)
GRID(20,40)
oGL("Pop")
oGL("Push")'Würfel, seulement très eingeschränktes Lighting
oGL("Move", -0.65, 0.5, 0)
oGL("Rotate", -45, 45, 0)
oGL("Cuboid", 0.75, 0.75,0.75)
oGL("Pop")
oGL("Push")'Kugel, avec vielen Dreiecken siehts richtig bien aus
oGL("Move", 1, 0, 0)
oGL("Sphere", 0.65, 192,192)
oGL("Pop")
oGL("Push")'quille / Cone
oGL("Move", 2.5, -1.5, -1.0)
oGL("Cylinder", 1.0, 0,2.0,192)
oGL("Pop")
oGL("Push")'Cylinder, sieht aussi avec wenigen Unterteilungen déjà bien aus
oGL("Move", -2.0, -0.5, -1.5)
oGL("Rotate", -15, -30, 30)
oGL("Cylinder", 0.20, 0.20,4,30)
oGL("Pop")
oGL("Show")
rtri! = rtri! + 1
endproc
Proc FloatArray
parameters x&,a!,b!,c!,d!
long x&,0 = single(a!)
long x&,4 = single(b!)
long x&,8 = single(c!)
long x&,12 = single(d!)
ENDPROC
' Hauptprogramm
' -------------
declare ende%
CLS 0
oGL("Init", %hWnd, 0,0,0,1)
oGL("PosMode", 1)
oGL("glEnable",~GL_CULL_FACE)
oGL("glEnable",~GL_DEPTH_TEST)
oGL("BlendMode", 1)
oGL("Fog", 3, 6, 14)
time& = &GetTickCount
frames% = 0
ende% = 0
WhileNot ende%
'WaitInput sollte dans 3D-Anwendungen et Spielen dans chaque le cas vermieden volonté,
'là là aussi sans timer ca. 8 ms unkontrollierbar verschwinden
si isKey(27)
ende% = 1
endif
DrawGLScene()
inc frames%
si &GetTickCount - time& >= 1000' 1 seconde ist 'rum
setText %hWnd, str$(frames%) + " Frames/sek"
time& = &GetTickCount
frames% = 0
endif
Endwhile
end
|