Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 29.01.2014, 17:29 Titel: OpenGL Point'n'Light |
|
|
Hab schon wieder ein weilchen nichts gemacht, und wollte einen einfachen Versuch starten...
Vorweg mal als Frage ob es so überhaupt machbar ist:
Ich möchte per OpenGL im Orthogonalen modus Points zeichnen, was auch gut klappt, nun würde ich zusätzlich noch Licht hinzufügen die ensprechend von Position des Lichts und Tiefe der Points auf der Z Achse (wo man im 2D modus sonst ja nichts sieht) einen Beleuchtungseffekt hinbekommen...
Also die 'Pixel' die weiter oben bzw direkt angetrahlt werden sollen heller sein und jene die von den anderen verdeckt sind dunkler... das ganze soll dann also einen 3D Effekt im 2D modus vermitteln...
Wollte das ganze gern zu einen Bmp/Image Filter/Effekt ausbauen...
mein Versuch:
Code: |
Randomize Timer
#include "GL/gl.bi"
#include "GL/glu.bi"
Const ScrWidth as Integer = 640
Const ScrHeight as Integer = 480
'-------------------------
' das Fenster öffnen
'-------------------------
Screenres ScrWidth, ScrHeight, 32, , 2
'-------------------------
' Open-GL Init
'-------------------------
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glViewport(0,0,ScrWidth,ScrHeight)
glOrtho(0, ScrWidth+1, ScrHeight+1, 0, -528, 528)
'gluPerspective 45.0, ScrWidth/ScrHeight, -128f, 128f
glMatrixMode (GL_MODELVIEW)
glLoadIdentity()
'glEnable(GL_CULL_FACE)
'glCullFace(GL_BACK)
glClearColor(0.0,0.0,0.3,0.0)
glClearDepth 1.0
glEnable GL_DEPTH_TEST
glClear GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT
'' Point-Size
'glShadeModel (GL_SMOOTH)
glPointSize(1.0f)
'' Light
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
glEnable(GL_COLOR_MATERIAL)
Dim as GLfloat light_ambient(0 to 3) = { 0.0, 0.0, 0.0, 1.0 }
Dim as GLfloat light_diffuse(0 to 3) = { 1.0, 1.0, 1.0, 1.0 }
Dim as GLfloat light_specular(0 to 3) = { 1.0, 1.0, 1.0, 1.0 }
Dim as GLfloat light_position(0 to 3) = { 320.0, 240.0, 527.0, 1.0 }
'Dim as GLfloat light_position(0 to 3) = { 0.0, 0.0, 527.0, 1.0 }
glLightfv(GL_LIGHT0, GL_AMBIENT, @light_ambient(0))
glLightfv(GL_LIGHT0, GL_DIFFUSE, @light_diffuse(0))
glLightfv(GL_LIGHT0, GL_SPECULAR, @light_specular(0))
glLightfv(GL_LIGHT0, GL_POSITION, @light_position(0))
'glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.1)
glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 45.0)
Dim as GLfloat spot_direction(0 to 2) = { 0.0, 0.0, -1.0 }
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, @spot_direction(0))
Dim as Integer D
Do
glLoadIdentity()
glClear GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT
glBegin GL_POINTS
glColor3ub 255,255,255
For x as Integer = 0 to 639
For y as Integer = 0 to 479
D = int(rnd*205)
'glColor3ub 255-y/3,255-y/3,255-y/3
glVertex3i x, y, 527-x'-227 + D'(y/2)
Next y
Next x
glEnd
glFlush
flip
sleep 1
Loop until Multikey(&h01)
|
Jedoch sieht man hier nur Beleuchtet/Unbeleuchtet... also weiß/grau ohne Schattierung oder dergleichen... könnte evtl mit der einfachheit des Beispiels zusammenhängen aber auch der Möglichkeit das es so gar nicht funktioniert...
Hab mit Licht noch nicht sehr viel gearbeitet und hoffe das einer noch ein paar Ideen dazu hat... _________________
|
|