19 GLuint fb
, colour
, rb
;
24 static void render_water_texture( m4x3f camera
);
25 static void render_water_surface( m4x4f pv
, m4x3f camera
);
26 static void render_world( m4x4f projection
, m4x3f camera
);
29 * http://www.terathon.com/lengyel/Lengyel-Oblique.pdf
31 static void plane_clip_projection( m4x4f mat
, v4f plane
)
35 (vg_signf(plane
[0]) + mat
[2][0]) / mat
[0][0],
36 (vg_signf(plane
[1]) + mat
[2][1]) / mat
[1][1],
38 (1.0f
+ mat
[2][2]) / mat
[3][2]
41 v4_muls( plane
, 2.0f
/ v4_dot(plane
,c
), c
);
45 mat
[2][2] = c
[2] + 1.0f
;
49 static void pipeline_projection( m4x4f mat
, float nearz
, float farz
)
53 (float)vg_window_x
/ (float)vg_window_y
,
57 static void fb_use( struct framebuffer
*fb
)
61 glBindFramebuffer( GL_FRAMEBUFFER
, 0 );
62 glViewport( 0, 0, vg_window_x
, vg_window_y
);
66 glBindFramebuffer( GL_FRAMEBUFFER
, fb
->fb
);
67 glViewport( 0, 0, vg_window_x
/ fb
->div
, vg_window_y
/ fb
->div
);
71 static void fb_init( struct framebuffer
*fb
)
73 i32 ix
= vg_window_x
/ fb
->div
,
74 iy
= vg_window_y
/ fb
->div
;
76 glGenFramebuffers( 1, &fb
->fb
);
77 glBindFramebuffer( GL_FRAMEBUFFER
, fb
->fb
);
79 glGenTextures( 1, &fb
->colour
);
80 glBindTexture( GL_TEXTURE_2D
, fb
->colour
);
81 glTexImage2D( GL_TEXTURE_2D
, 0, fb
->format
, ix
, iy
,
82 0, fb
->format
, GL_UNSIGNED_BYTE
, NULL
);
84 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_LINEAR
);
85 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_LINEAR
);
86 glFramebufferTexture2D( GL_FRAMEBUFFER
, GL_COLOR_ATTACHMENT0
,
87 GL_TEXTURE_2D
, fb
->colour
, 0);
89 glGenRenderbuffers( 1, &fb
->rb
);
90 glBindRenderbuffer( GL_RENDERBUFFER
, fb
->rb
);
91 glRenderbufferStorage( GL_RENDERBUFFER
, GL_DEPTH24_STENCIL8
, ix
, iy
);
93 glFramebufferRenderbuffer( GL_FRAMEBUFFER
, GL_DEPTH_STENCIL_ATTACHMENT
,
94 GL_RENDERBUFFER
, fb
->rb
);
97 static void fb_bindtex( struct framebuffer
*fb
, int texture
)
99 glActiveTexture( GL_TEXTURE0
+ texture
);
100 glBindTexture( GL_TEXTURE_2D
, fb
->colour
);
103 static void fb_resize( struct framebuffer
*fb
)
105 i32 ix
= vg_window_x
/ fb
->div
,
106 iy
= vg_window_y
/ fb
->div
;
108 glBindTexture( GL_TEXTURE_2D
, fb
->colour
);
109 glTexImage2D( GL_TEXTURE_2D
, 0, fb
->format
, ix
, iy
, 0,
110 fb
->format
, GL_UNSIGNED_BYTE
, NULL
);
112 glBindRenderbuffer( GL_RENDERBUFFER
, fb
->rb
);
113 glRenderbufferStorage( GL_RENDERBUFFER
, GL_DEPTH24_STENCIL8
, ix
, iy
);
116 static void render_fb_resize(void)
118 glBindTexture( GL_TEXTURE_2D
, gpipeline
.rgb_background
);
119 glTexImage2D( GL_TEXTURE_2D
, 0, GL_RGB
, vg_window_x
, vg_window_y
, 0,
120 GL_RGB
, GL_UNSIGNED_BYTE
, NULL
);
123 static void render_init(void)
125 glGenFramebuffers( 1, &gpipeline
.fb_background
);
126 glBindFramebuffer( GL_FRAMEBUFFER
, gpipeline
.fb_background
);
128 glGenTextures( 1, &gpipeline
.rgb_background
);
129 glBindTexture( GL_TEXTURE_2D
, gpipeline
.rgb_background
);
130 glTexImage2D( GL_TEXTURE_2D
, 0, GL_RGB
, vg_window_x
, vg_window_y
,
131 0, GL_RGB
, GL_UNSIGNED_BYTE
, NULL
);
133 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_LINEAR
);
134 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_LINEAR
);
135 glFramebufferTexture2D( GL_FRAMEBUFFER
, GL_COLOR_ATTACHMENT0
,
137 gpipeline
.rgb_background
, 0);
139 float quad
[] = { 0.0f
, 0.0f
, 1.0f
, 1.0f
, 0.0f
, 1.0f
,
140 0.0f
, 0.0f
, 1.0f
, 0.0f
, 1.0f
, 1.0f
};
142 glGenVertexArrays( 1, &gpipeline
.fsquad
.vao
);
143 glGenBuffers( 1, &gpipeline
.fsquad
.vbo
);
144 glBindVertexArray( gpipeline
.fsquad
.vao
);
145 glBindBuffer( GL_ARRAY_BUFFER
, gpipeline
.fsquad
.vbo
);
146 glBufferData( GL_ARRAY_BUFFER
, sizeof(quad
), quad
, GL_STATIC_DRAW
);
147 glBindVertexArray( gpipeline
.fsquad
.vao
);
148 glVertexAttribPointer( 0, 2, GL_FLOAT
, GL_FALSE
,
149 sizeof(float)*2, (void*)0 );
150 glEnableVertexAttribArray( 0 );
154 static void render_fsquad(void)
156 glBindVertexArray( gpipeline
.fsquad
.vao
);
157 glDrawArrays( GL_TRIANGLES
, 0, 6 );
160 #endif /* RENDER_H */