Add environment mapping to spheres demo. Modernize more code in bunny and demo-support

db4
Joe Groff 2008-04-16 21:06:13 -07:00
parent b26eadc5ea
commit 60025d45c3
3 changed files with 112 additions and 64 deletions

View File

@ -234,4 +234,4 @@ M: bunny-outlined draw-bunny
M: bunny-outlined dispose
[ bunny-outlined-pass1-program [ delete-gl-program ] when* ]
[ bunny-outlined-pass2-program [ delete-gl-program ] when* ]
[ dispose-framebuffer ] tri
[ dispose-framebuffer ] tri ;

View File

@ -1,13 +1,10 @@
USING: arrays combinators.lib kernel math math.functions math.vectors namespaces
opengl opengl.gl sequences ui ui.gadgets ui.gestures ui.render ;
opengl opengl.gl sequences ui ui.gadgets ui.gestures ui.render accessors ;
IN: opengl.demo-support
: FOV 2.0 sqrt 1+ ; inline
: MOUSE-MOTION-SCALE 0.5 ; inline
: KEY-ROTATE-STEP 1.0 ; inline
: DIMS { 640 480 } ; inline
: FOV-RATIO ( -- fov ) DIMS dup first2 min v/n ;
SYMBOL: last-drag-loc
@ -15,7 +12,7 @@ TUPLE: demo-gadget yaw pitch distance ;
: <demo-gadget> ( yaw pitch distance -- gadget )
demo-gadget construct-gadget
[ { set-demo-gadget-yaw set-demo-gadget-pitch set-demo-gadget-distance } set-slots ] keep ;
[ { (>>yaw) (>>pitch) (>>distance) } set-slots ] keep ;
GENERIC: far-plane ( gadget -- z )
GENERIC: near-plane ( gadget -- z )
@ -28,6 +25,8 @@ M: demo-gadget near-plane ( gadget -- z )
M: demo-gadget distance-step ( gadget -- dz )
drop 1.0 64.0 / ;
: fov-ratio ( gadget -- fov ) dim>> dup first2 min v/n ;
: yaw-demo-gadget ( yaw gadget -- )
[ [ demo-gadget-yaw + ] keep set-demo-gadget-yaw ] keep relayout-1 ;
@ -38,16 +37,16 @@ M: demo-gadget distance-step ( gadget -- dz )
[ [ demo-gadget-distance + ] keep set-demo-gadget-distance ] keep relayout-1 ;
M: demo-gadget pref-dim* ( gadget -- dim )
drop DIMS ;
drop { 640 480 } ;
: -+ ( x -- -x x )
dup neg swap ;
: demo-gadget-frustum ( gadget -- -x x -y y near far )
[ near-plane ] [ far-plane ] bi [
drop FOV-RATIO swap FOV / v*n
[ near-plane ] [ far-plane ] [ fov-ratio ] tri [
nip swap FOV / v*n
first2 [ -+ ] bi@
] 2keep ;
] 3keep drop ;
: demo-gadget-set-matrices ( gadget -- )
GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT bitor glClear
@ -58,9 +57,9 @@ M: demo-gadget pref-dim* ( gadget -- dim )
] [
GL_MODELVIEW glMatrixMode
glLoadIdentity
[ >r 0.0 0.0 r> demo-gadget-distance neg glTranslatef ]
[ demo-gadget-pitch 1.0 0.0 0.0 glRotatef ]
[ demo-gadget-yaw 0.0 1.0 0.0 glRotatef ]
[ >r 0.0 0.0 r> distance>> neg glTranslatef ]
[ pitch>> 1.0 0.0 0.0 glRotatef ]
[ yaw>> 0.0 1.0 0.0 glRotatef ]
tri
] bi ;

View File

@ -1,6 +1,6 @@
USING: kernel opengl.demo-support opengl.gl opengl.shaders opengl.framebuffers
opengl multiline ui.gadgets accessors sequences ui.render ui math
arrays.lib combinators ;
arrays arrays.lib combinators ;
IN: spheres
STRING: plane-vertex-shader
@ -48,17 +48,15 @@ main()
}
;
STRING: sphere-fragment-shader
STRING: sphere-solid-color-fragment-shader
uniform vec3 light_position;
varying float vradius;
varying vec3 sphere_position;
varying vec4 world_position, vcolor;
varying vec4 vcolor;
vec4 ambient = vec4(0.3, 0.2, 0.2, 1.0);
vec4 diffuse = vec4(0.7, 0.8, 0.8, 1.0);
const vec4 ambient = vec4(0.25, 0.2, 0.25, 1.0);
const vec4 diffuse = vec4(0.75, 0.8, 0.75, 1.0);
vec4
light(vec3 point, vec3 normal)
sphere_color(vec3 point, vec3 normal)
{
vec3 transformed_light_position = (gl_ModelViewMatrix * vec4(light_position, 1)).xyz;
vec3 direction = normalize(transformed_light_position - point);
@ -66,6 +64,25 @@ light(vec3 point, vec3 normal)
return ambient * vcolor + diffuse * vec4(d * vcolor.rgb, vcolor.a);
}
;
STRING: sphere-texture-fragment-shader
uniform samplerCube surface_texture;
vec4
sphere_color(vec3 point, vec3 normal)
{
vec3 reflect = reflect(normalize(point), normal);
return textureCube(surface_texture, reflect * gl_NormalMatrix);
}
;
STRING: sphere-main-fragment-shader
varying float vradius;
varying vec3 sphere_position;
varying vec4 world_position;
vec4 sphere_color(vec3 point, vec3 normal);
void
main()
@ -78,12 +95,12 @@ main()
vec4 transformed_surface = gl_ProjectionMatrix * world_surface;
gl_FragDepth = (transformed_surface.z/transformed_surface.w + 1.0) * 0.5;
gl_FragColor = light(world_surface.xyz, surface);
gl_FragColor = sphere_color(world_surface.xyz, surface);
}
;
TUPLE: spheres-gadget
plane-program sphere-program
plane-program solid-sphere-program texture-sphere-program
reflection-framebuffer reflection-depthbuffer
reflection-texture ;
@ -98,6 +115,9 @@ M: spheres-gadget far-plane ( gadget -- z )
M: spheres-gadget distance-step ( gadget -- dz )
drop 0.5 ;
: (reflection-dim) ( -- w h )
1024 1024 ;
: (make-reflection-texture) ( -- texture )
gen-texture [
GL_TEXTURE_CUBE_MAP swap glBindTexture
@ -109,14 +129,14 @@ M: spheres-gadget distance-step ( gadget -- dz )
GL_TEXTURE_CUBE_MAP_NEGATIVE_X
GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 6 narray
[ 0 GL_RGBA8 1024 1024 0 GL_RGBA GL_UNSIGNED_BYTE f glTexImage2D ]
[ 0 GL_RGBA8 (reflection-dim) 0 GL_RGBA GL_UNSIGNED_BYTE f glTexImage2D ]
each
] keep ;
: (make-reflection-depthbuffer) ( -- depthbuffer )
gen-renderbuffer [
GL_RENDERBUFFER_EXT swap glBindRenderbufferEXT
GL_RENDERBUFFER_EXT GL_DEPTH_COMPONENT32 1024 1024 glRenderbufferStorageEXT
GL_RENDERBUFFER_EXT GL_DEPTH_COMPONENT32 (reflection-dim) glRenderbufferStorageEXT
] keep ;
: (make-reflection-framebuffer) ( depthbuffer -- framebuffer )
@ -126,11 +146,23 @@ M: spheres-gadget distance-step ( gadget -- dz )
glFramebufferRenderbufferEXT
] with-framebuffer ;
: (plane-program) ( -- program )
plane-vertex-shader plane-fragment-shader <simple-gl-program> ;
: (solid-sphere-program) ( -- program )
sphere-vertex-shader <vertex-shader> check-gl-shader
sphere-solid-color-fragment-shader <fragment-shader> check-gl-shader
sphere-main-fragment-shader <fragment-shader> check-gl-shader
3array <gl-program> check-gl-program ;
: (texture-sphere-program) ( -- program )
sphere-vertex-shader <vertex-shader> check-gl-shader
sphere-texture-fragment-shader <fragment-shader> check-gl-shader
sphere-main-fragment-shader <fragment-shader> check-gl-shader
3array <gl-program> check-gl-program ;
M: spheres-gadget graft* ( gadget -- )
plane-vertex-shader plane-fragment-shader
<simple-gl-program> >>plane-program
sphere-vertex-shader sphere-fragment-shader
<simple-gl-program> >>sphere-program
(plane-program) >>plane-program
(solid-sphere-program) >>solid-sphere-program
(texture-sphere-program) >>texture-sphere-program
(make-reflection-texture) >>reflection-texture
(make-reflection-depthbuffer) [ >>reflection-depthbuffer ] keep
(make-reflection-framebuffer) >>reflection-framebuffer
@ -141,7 +173,8 @@ M: spheres-gadget ungraft* ( gadget -- )
[ reflection-framebuffer>> [ delete-framebuffer ] when* ]
[ reflection-depthbuffer>> [ delete-renderbuffer ] when* ]
[ reflection-texture>> [ delete-texture ] when* ]
[ sphere-program>> [ delete-gl-program ] when* ]
[ solid-sphere-program>> [ delete-gl-program ] when* ]
[ texture-sphere-program>> [ delete-gl-program ] when* ]
[ plane-program>> [ delete-gl-program ] when* ]
} cleave ;
@ -157,15 +190,19 @@ M: spheres-gadget pref-dim* ( gadget -- dim )
{ -1.0 -1.0 } { 1.0 1.0 } rect-vertices ;
: sphere-scene ( gadget -- )
GL_DEPTH_BUFFER_BIT GL_COLOR_BUFFER_BIT bitor
glClear
GL_DEPTH_BUFFER_BIT GL_COLOR_BUFFER_BIT bitor glClear
[
sphere-program>> dup {
solid-sphere-program>> dup {
{ "light_position" [ 0.0 0.0 100.0 glUniform3f ] }
} [
[ { 0.0 0.0 0.0 } 4.0 { 1.0 1.0 0.0 1.0 } (draw-sphere) ]
[ { 7.0 0.0 0.0 } 1.0 { 1.0 0.0 0.0 1.0 } (draw-sphere) ]
[ { -7.0 0.0 0.0 } 1.0 { 0.0 1.0 0.0 1.0 } (draw-sphere) ] tri
{
[ { 7.0 0.0 0.0 } 1.0 { 1.0 0.0 0.0 1.0 } (draw-sphere) ]
[ { -7.0 0.0 0.0 } 1.0 { 0.0 1.0 0.0 1.0 } (draw-sphere) ]
[ { 0.0 0.0 7.0 } 1.0 { 0.0 0.0 1.0 1.0 } (draw-sphere) ]
[ { 0.0 0.0 -7.0 } 1.0 { 1.0 1.0 0.0 1.0 } (draw-sphere) ]
[ { 0.0 7.0 0.0 } 1.0 { 1.0 0.0 1.0 1.0 } (draw-sphere) ]
[ { 0.0 -7.0 0.0 } 1.0 { 0.0 1.0 1.0 1.0 } (draw-sphere) ]
} cleave
] with-gl-program
] [
plane-program>> { } [
@ -187,44 +224,56 @@ M: spheres-gadget pref-dim* ( gadget -- dim )
swap reflection-texture>> >r >r
GL_FRAMEBUFFER_EXT
GL_COLOR_ATTACHMENT0_EXT
r> r> 0 glFramebufferTexture2DEXT ;
r> r> 0 glFramebufferTexture2DEXT
check-framebuffer ;
M: spheres-gadget draw-gadget* ( gadget -- )
GL_DEPTH_TEST glEnable
0.15 0.15 1.0 1.0 glClearColor {
: (draw-reflection-texture) ( gadget -- )
dup reflection-framebuffer>> [ {
[ drop 0 0 (reflection-dim) glViewport ]
[
GL_PROJECTION glMatrixMode
glLoadIdentity
reflection-frustum glFrustum
GL_MODELVIEW glMatrixMode
glLoadIdentity
glPushMatrix
]
[
dup reflection-framebuffer>> [ {
[ GL_TEXTURE_CUBE_MAP_NEGATIVE_Z (reflection-face) ]
[ sphere-scene ]
[ GL_TEXTURE_CUBE_MAP_NEGATIVE_X (reflection-face)
90.0 0.0 1.0 0.0 glRotatef ]
[ sphere-scene ]
[ GL_TEXTURE_CUBE_MAP_POSITIVE_Z (reflection-face)
90.0 0.0 1.0 0.0 glRotatef ]
[ sphere-scene ]
[ GL_TEXTURE_CUBE_MAP_POSITIVE_X (reflection-face)
90.0 0.0 1.0 0.0 glRotatef ]
[ sphere-scene ]
[ GL_TEXTURE_CUBE_MAP_POSITIVE_Y (reflection-face)
glPopMatrix glPushMatrix
90.0 1.0 0.0 0.0 glRotatef ]
[ sphere-scene ]
[ GL_TEXTURE_CUBE_MAP_NEGATIVE_Y (reflection-face)
glPopMatrix
-90.0 1.0 0.0 0.0 glRotatef ]
[ sphere-scene ]
} cleave ] with-framebuffer
180.0 0.0 0.0 1.0 glRotatef
]
[ GL_TEXTURE_CUBE_MAP_NEGATIVE_Z (reflection-face) ]
[ sphere-scene ]
[ GL_TEXTURE_CUBE_MAP_POSITIVE_X (reflection-face)
90.0 0.0 1.0 0.0 glRotatef ]
[ sphere-scene ]
[ GL_TEXTURE_CUBE_MAP_POSITIVE_Z (reflection-face)
90.0 0.0 1.0 0.0 glRotatef glPushMatrix ]
[ sphere-scene ]
[ GL_TEXTURE_CUBE_MAP_NEGATIVE_X (reflection-face)
90.0 0.0 1.0 0.0 glRotatef ]
[ sphere-scene ]
[ GL_TEXTURE_CUBE_MAP_NEGATIVE_Y (reflection-face)
glPopMatrix glPushMatrix -90.0 1.0 0.0 0.0 glRotatef ]
[ sphere-scene ]
[ GL_TEXTURE_CUBE_MAP_POSITIVE_Y (reflection-face)
glPopMatrix 90.0 1.0 0.0 0.0 glRotatef ]
[ sphere-scene ]
[ dim>> 0 0 rot first2 glViewport ]
} cleave ] with-framebuffer ;
M: spheres-gadget draw-gadget* ( gadget -- )
GL_DEPTH_TEST glEnable
GL_SCISSOR_TEST glDisable
0.15 0.15 1.0 1.0 glClearColor {
[ (draw-reflection-texture) ]
[ demo-gadget-set-matrices ]
[ sphere-scene ]
[
{ texture-sphere-program>> reflection-texture>> } get-slots
GL_TEXTURE_CUBE_MAP GL_TEXTURE0 bind-texture-unit
dup {
{ "surface_texture" [ 0 glUniform1i ] }
} [
{ 0.0 0.0 0.0 } 4.0 { 1.0 0.0 0.0 1.0 } (draw-sphere)
] with-gl-program
]
} cleave ;
: spheres-window ( -- )