OpenGL: Converted gpu_compositing.c to use batches.
This commit is contained in:
@@ -47,6 +47,7 @@
|
|||||||
#include "GPU_glew.h"
|
#include "GPU_glew.h"
|
||||||
#include "GPU_shader.h"
|
#include "GPU_shader.h"
|
||||||
#include "GPU_texture.h"
|
#include "GPU_texture.h"
|
||||||
|
#include "GPU_batch.h"
|
||||||
|
|
||||||
#include "MEM_guardedalloc.h"
|
#include "MEM_guardedalloc.h"
|
||||||
|
|
||||||
@@ -193,7 +194,8 @@ struct GPUFX {
|
|||||||
/* we have a stencil, restore the previous state */
|
/* we have a stencil, restore the previous state */
|
||||||
bool restore_stencil;
|
bool restore_stencil;
|
||||||
|
|
||||||
unsigned int vbuffer;
|
Batch *quad_batch;
|
||||||
|
Batch *point_batch;
|
||||||
};
|
};
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
@@ -269,12 +271,32 @@ GPUFX *GPU_fx_compositor_create(void)
|
|||||||
{
|
{
|
||||||
GPUFX *fx = MEM_callocN(sizeof(GPUFX), "GPUFX compositor");
|
GPUFX *fx = MEM_callocN(sizeof(GPUFX), "GPUFX compositor");
|
||||||
|
|
||||||
glGenBuffers(1, &fx->vbuffer);
|
/* Quad buffer */
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, fx->vbuffer);
|
static VertexFormat format = {0};
|
||||||
glBufferData(GL_ARRAY_BUFFER, 16 * sizeof(float), NULL, GL_STATIC_DRAW);
|
static unsigned int pos, uvs;
|
||||||
glBufferSubData(GL_ARRAY_BUFFER, 0, 8 * sizeof(float), fullscreencos);
|
if (format.attrib_ct == 0) {
|
||||||
glBufferSubData(GL_ARRAY_BUFFER, 8 * sizeof(float), 8 * sizeof(float), fullscreenuvs);
|
pos = add_attrib(&format, "pos", GL_FLOAT, 2, KEEP_FLOAT);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
uvs = add_attrib(&format, "uvs", GL_FLOAT, 2, KEEP_FLOAT);
|
||||||
|
}
|
||||||
|
VertexBuffer *vbo = VertexBuffer_create_with_format(&format);
|
||||||
|
VertexBuffer_allocate_data(vbo, 4);
|
||||||
|
for (int i = 0; i < 4; ++i) {
|
||||||
|
setAttrib(vbo, pos, i, fullscreencos[i]);
|
||||||
|
setAttrib(vbo, uvs, i, fullscreenuvs[i]);
|
||||||
|
}
|
||||||
|
fx->quad_batch = Batch_create(GL_TRIANGLE_STRIP, vbo, NULL);
|
||||||
|
|
||||||
|
/* Point Buffer */
|
||||||
|
static VertexFormat format_point = {0};
|
||||||
|
static unsigned int dummy_attrib;
|
||||||
|
if (format_point.attrib_ct == 0) {
|
||||||
|
dummy_attrib = add_attrib(&format_point, "pos", GL_FLOAT, 2, KEEP_FLOAT);
|
||||||
|
}
|
||||||
|
float dummy[2] = {0.0f, 0.0f};
|
||||||
|
VertexBuffer *vbo_point = VertexBuffer_create_with_format(&format_point);
|
||||||
|
VertexBuffer_allocate_data(vbo_point, 1);
|
||||||
|
setAttrib(vbo_point, dummy_attrib, 0, &dummy);
|
||||||
|
fx->point_batch = Batch_create(GL_POINTS, vbo_point, NULL);
|
||||||
|
|
||||||
return fx;
|
return fx;
|
||||||
}
|
}
|
||||||
@@ -364,7 +386,8 @@ static void cleanup_fx_gl_data(GPUFX *fx, bool do_fbo)
|
|||||||
void GPU_fx_compositor_destroy(GPUFX *fx)
|
void GPU_fx_compositor_destroy(GPUFX *fx)
|
||||||
{
|
{
|
||||||
cleanup_fx_gl_data(fx, true);
|
cleanup_fx_gl_data(fx, true);
|
||||||
glDeleteBuffers(1, &fx->vbuffer);
|
Batch_discard_all(fx->quad_batch);
|
||||||
|
Batch_discard_all(fx->point_batch);
|
||||||
MEM_freeN(fx);
|
MEM_freeN(fx);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -702,19 +725,13 @@ void GPU_fx_compositor_XRay_resolve(GPUFX *fx)
|
|||||||
/* disable writing to color buffer, it's depth only pass */
|
/* disable writing to color buffer, it's depth only pass */
|
||||||
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
|
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
|
||||||
|
|
||||||
/* set up quad buffer */
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, fx->vbuffer);
|
|
||||||
glVertexPointer(2, GL_FLOAT, 0, NULL);
|
|
||||||
glTexCoordPointer(2, GL_FLOAT, 0, ((GLubyte *)NULL + 8 * sizeof(float)));
|
|
||||||
glEnableClientState(GL_VERTEX_ARRAY);
|
|
||||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
||||||
|
|
||||||
depth_resolve_shader = GPU_shader_get_builtin_fx_shader(GPU_SHADER_FX_DEPTH_RESOLVE, false);
|
depth_resolve_shader = GPU_shader_get_builtin_fx_shader(GPU_SHADER_FX_DEPTH_RESOLVE, false);
|
||||||
|
|
||||||
if (depth_resolve_shader) {
|
if (depth_resolve_shader) {
|
||||||
GPUDepthResolveInterface *interface = GPU_fx_shader_get_interface(depth_resolve_shader);
|
GPUDepthResolveInterface *interface = GPU_fx_shader_get_interface(depth_resolve_shader);
|
||||||
|
|
||||||
GPU_shader_bind(depth_resolve_shader);
|
/* set up quad buffer */
|
||||||
|
Batch_set_program(fx->quad_batch, GPU_shader_get_program(depth_resolve_shader));
|
||||||
|
|
||||||
GPU_texture_bind(fx->depth_buffer_xray, 0);
|
GPU_texture_bind(fx->depth_buffer_xray, 0);
|
||||||
GPU_texture_compare_mode(fx->depth_buffer_xray, false);
|
GPU_texture_compare_mode(fx->depth_buffer_xray, false);
|
||||||
@@ -722,7 +739,7 @@ void GPU_fx_compositor_XRay_resolve(GPUFX *fx)
|
|||||||
GPU_shader_uniform_texture(depth_resolve_shader, interface->depth_uniform, fx->depth_buffer_xray);
|
GPU_shader_uniform_texture(depth_resolve_shader, interface->depth_uniform, fx->depth_buffer_xray);
|
||||||
|
|
||||||
/* draw */
|
/* draw */
|
||||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
Batch_draw(fx->quad_batch);
|
||||||
|
|
||||||
/* disable bindings */
|
/* disable bindings */
|
||||||
GPU_texture_compare_mode(fx->depth_buffer_xray, true);
|
GPU_texture_compare_mode(fx->depth_buffer_xray, true);
|
||||||
@@ -734,10 +751,6 @@ void GPU_fx_compositor_XRay_resolve(GPUFX *fx)
|
|||||||
|
|
||||||
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
|
||||||
glDisableClientState(GL_VERTEX_ARRAY);
|
|
||||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
||||||
|
|
||||||
glPopAttrib();
|
glPopAttrib();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -774,13 +787,6 @@ bool GPU_fx_do_composite_pass(
|
|||||||
src = fx->color_buffer;
|
src = fx->color_buffer;
|
||||||
target = fx->color_buffer_sec;
|
target = fx->color_buffer_sec;
|
||||||
|
|
||||||
/* set up quad buffer */
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, fx->vbuffer);
|
|
||||||
glVertexPointer(2, GL_FLOAT, 0, NULL);
|
|
||||||
glTexCoordPointer(2, GL_FLOAT, 0, ((GLubyte *)NULL + 8 * sizeof(float)));
|
|
||||||
glEnableClientState(GL_VERTEX_ARRAY);
|
|
||||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
||||||
|
|
||||||
/* full screen FX pass */
|
/* full screen FX pass */
|
||||||
|
|
||||||
/* invert the view matrix */
|
/* invert the view matrix */
|
||||||
@@ -808,8 +814,6 @@ bool GPU_fx_do_composite_pass(
|
|||||||
viewvecs[1][2] = vec_far[2] - viewvecs[0][2];
|
viewvecs[1][2] = vec_far[2] - viewvecs[0][2];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set invalid color in case shader fails */
|
|
||||||
glColor3f(1.0, 0.0, 1.0);
|
|
||||||
glDisable(GL_DEPTH_TEST);
|
glDisable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
/* ssao pass */
|
/* ssao pass */
|
||||||
@@ -830,7 +834,7 @@ bool GPU_fx_do_composite_pass(
|
|||||||
|
|
||||||
GPUSSAOShaderInterface *interface = GPU_fx_shader_get_interface(ssao_shader);
|
GPUSSAOShaderInterface *interface = GPU_fx_shader_get_interface(ssao_shader);
|
||||||
|
|
||||||
GPU_shader_bind(ssao_shader);
|
Batch_set_program(fx->quad_batch, GPU_shader_get_program(ssao_shader));
|
||||||
|
|
||||||
GPU_shader_uniform_vector(ssao_shader, interface->ssao_uniform, 4, 1, ssao_params);
|
GPU_shader_uniform_vector(ssao_shader, interface->ssao_uniform, 4, 1, ssao_params);
|
||||||
GPU_shader_uniform_vector(ssao_shader, interface->ssao_color_uniform, 4, 1, fx_ssao->color);
|
GPU_shader_uniform_vector(ssao_shader, interface->ssao_color_uniform, 4, 1, fx_ssao->color);
|
||||||
@@ -854,7 +858,7 @@ bool GPU_fx_do_composite_pass(
|
|||||||
/* draw */
|
/* draw */
|
||||||
gpu_fx_bind_render_target(&passes_left, fx, ofs, target);
|
gpu_fx_bind_render_target(&passes_left, fx, ofs, target);
|
||||||
|
|
||||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
Batch_draw(fx->quad_batch);
|
||||||
|
|
||||||
/* disable bindings */
|
/* disable bindings */
|
||||||
GPU_texture_unbind(src);
|
GPU_texture_unbind(src);
|
||||||
@@ -912,11 +916,8 @@ bool GPU_fx_do_composite_pass(
|
|||||||
if (!(dof_shader_pass1 && dof_shader_pass2 && dof_shader_pass3)) {
|
if (!(dof_shader_pass1 && dof_shader_pass2 && dof_shader_pass3)) {
|
||||||
GPU_framebuffer_texture_unbind(fx->gbuffer, NULL);
|
GPU_framebuffer_texture_unbind(fx->gbuffer, NULL);
|
||||||
GPU_framebuffer_restore();
|
GPU_framebuffer_restore();
|
||||||
glDisableClientState(GL_VERTEX_ARRAY);
|
|
||||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
||||||
|
|
||||||
GPU_shader_unbind();
|
GPU_shader_unbind();
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -926,7 +927,7 @@ bool GPU_fx_do_composite_pass(
|
|||||||
|
|
||||||
GPUDOFHQPassOneInterface *interface = GPU_fx_shader_get_interface(dof_shader_pass1);
|
GPUDOFHQPassOneInterface *interface = GPU_fx_shader_get_interface(dof_shader_pass1);
|
||||||
|
|
||||||
GPU_shader_bind(dof_shader_pass1);
|
Batch_set_program(fx->quad_batch, GPU_shader_get_program(dof_shader_pass1));
|
||||||
|
|
||||||
GPU_shader_uniform_vector(dof_shader_pass1, interface->dof_uniform, 4, 1, dof_params);
|
GPU_shader_uniform_vector(dof_shader_pass1, interface->dof_uniform, 4, 1, dof_params);
|
||||||
GPU_shader_uniform_vector(dof_shader_pass1, interface->invrendertargetdim_uniform, 2, 1, invrendertargetdim);
|
GPU_shader_uniform_vector(dof_shader_pass1, interface->invrendertargetdim_uniform, 2, 1, invrendertargetdim);
|
||||||
@@ -953,7 +954,8 @@ bool GPU_fx_do_composite_pass(
|
|||||||
|
|
||||||
GPU_framebuffer_check_valid(fx->gbuffer, NULL);
|
GPU_framebuffer_check_valid(fx->gbuffer, NULL);
|
||||||
|
|
||||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
Batch_draw(fx->quad_batch);
|
||||||
|
|
||||||
/* disable bindings */
|
/* disable bindings */
|
||||||
GPU_texture_filter_mode(src, true);
|
GPU_texture_filter_mode(src, true);
|
||||||
GPU_texture_unbind(src);
|
GPU_texture_unbind(src);
|
||||||
@@ -977,17 +979,16 @@ bool GPU_fx_do_composite_pass(
|
|||||||
|
|
||||||
GPUDOFHQPassTwoInterface *interface = GPU_fx_shader_get_interface(dof_shader_pass2);
|
GPUDOFHQPassTwoInterface *interface = GPU_fx_shader_get_interface(dof_shader_pass2);
|
||||||
|
|
||||||
GPU_shader_bind(dof_shader_pass2);
|
Batch_set_program(fx->point_batch, GPU_shader_get_program(dof_shader_pass2));
|
||||||
|
|
||||||
|
GPU_texture_bind(fx->dof_nearfar_coc, numslots++);
|
||||||
|
GPU_texture_bind(fx->dof_half_downsampled_far, numslots++);
|
||||||
|
GPU_texture_bind(fx->dof_half_downsampled_near, numslots++);
|
||||||
|
|
||||||
GPU_shader_uniform_vector(dof_shader_pass2, interface->dof_uniform, 4, 1, dof_params);
|
GPU_shader_uniform_vector(dof_shader_pass2, interface->dof_uniform, 4, 1, dof_params);
|
||||||
GPU_shader_uniform_vector_int(dof_shader_pass2, interface->rendertargetdim_uniform, 2, 1, rendertargetdim);
|
GPU_shader_uniform_vector_int(dof_shader_pass2, interface->rendertargetdim_uniform, 2, 1, rendertargetdim);
|
||||||
GPU_shader_uniform_vector(dof_shader_pass2, interface->select_uniform, 2, 1, selection);
|
GPU_shader_uniform_vector(dof_shader_pass2, interface->select_uniform, 2, 1, selection);
|
||||||
|
|
||||||
GPU_texture_bind(fx->dof_nearfar_coc, numslots++);
|
|
||||||
GPU_shader_uniform_texture(dof_shader_pass2, interface->coc_uniform, fx->dof_nearfar_coc);
|
GPU_shader_uniform_texture(dof_shader_pass2, interface->coc_uniform, fx->dof_nearfar_coc);
|
||||||
|
|
||||||
GPU_texture_bind(fx->dof_half_downsampled_far, numslots++);
|
|
||||||
GPU_texture_bind(fx->dof_half_downsampled_near, numslots++);
|
|
||||||
GPU_shader_uniform_texture(dof_shader_pass2, interface->color_uniform, fx->dof_half_downsampled_far);
|
GPU_shader_uniform_texture(dof_shader_pass2, interface->color_uniform, fx->dof_half_downsampled_far);
|
||||||
GPU_texture_filter_mode(fx->dof_half_downsampled_far, false);
|
GPU_texture_filter_mode(fx->dof_half_downsampled_far, false);
|
||||||
|
|
||||||
@@ -1003,24 +1004,24 @@ bool GPU_fx_do_composite_pass(
|
|||||||
glClearColor(0.0, 0.0, 0.0, 0.0);
|
glClearColor(0.0, 0.0, 0.0, 0.0);
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
/* the draw call we all waited for, draw a point per pixel, scaled per circle of confusion */
|
/* the draw call we all waited for, draw a point per pixel, scaled per circle of confusion */
|
||||||
glDrawArraysInstancedARB(GL_POINTS, 0, 1, fx->dof_downsampled_w * fx->dof_downsampled_h);
|
Batch_draw_stupid_instanced(fx->point_batch, 0, fx->dof_downsampled_w * fx->dof_downsampled_h, 0, 0, NULL, NULL);
|
||||||
|
|
||||||
GPU_texture_unbind(fx->dof_half_downsampled_far);
|
GPU_texture_unbind(fx->dof_half_downsampled_far);
|
||||||
GPU_framebuffer_texture_detach(fx->dof_far_blur);
|
GPU_framebuffer_texture_detach(fx->dof_far_blur);
|
||||||
|
|
||||||
GPU_shader_uniform_texture(dof_shader_pass2, interface->color_uniform, fx->dof_half_downsampled_near);
|
|
||||||
GPU_texture_filter_mode(fx->dof_half_downsampled_near, false);
|
|
||||||
|
|
||||||
selection[0] = 1.0f;
|
selection[0] = 1.0f;
|
||||||
selection[1] = 0.0f;
|
selection[1] = 0.0f;
|
||||||
|
|
||||||
GPU_shader_uniform_vector(dof_shader_pass2, interface->select_uniform, 2, 1, selection);
|
GPU_shader_uniform_vector(dof_shader_pass2, interface->select_uniform, 2, 1, selection);
|
||||||
|
GPU_shader_uniform_texture(dof_shader_pass2, interface->color_uniform, fx->dof_half_downsampled_near);
|
||||||
|
GPU_texture_filter_mode(fx->dof_half_downsampled_near, false);
|
||||||
|
|
||||||
GPU_framebuffer_texture_attach(fx->gbuffer, fx->dof_near_blur, 0);
|
GPU_framebuffer_texture_attach(fx->gbuffer, fx->dof_near_blur, 0);
|
||||||
/* have to clear the buffer unfortunately */
|
/* have to clear the buffer unfortunately */
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
/* the draw call we all waited for, draw a point per pixel, scaled per circle of confusion */
|
/* the draw call we all waited for, draw a point per pixel, scaled per circle of confusion */
|
||||||
glDrawArraysInstancedARB(GL_POINTS, 0, 1, fx->dof_downsampled_w * fx->dof_downsampled_h);
|
Batch_draw_stupid_instanced(fx->point_batch, 0, fx->dof_downsampled_w * fx->dof_downsampled_h, 0, 0, NULL, NULL);
|
||||||
|
Batch_done_using_program(fx->point_batch);
|
||||||
|
|
||||||
/* disable bindings */
|
/* disable bindings */
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
@@ -1032,6 +1033,7 @@ bool GPU_fx_do_composite_pass(
|
|||||||
GPU_texture_unbind(fx->dof_nearfar_coc);
|
GPU_texture_unbind(fx->dof_nearfar_coc);
|
||||||
|
|
||||||
GPU_framebuffer_texture_unbind(fx->gbuffer, fx->dof_far_blur);
|
GPU_framebuffer_texture_unbind(fx->gbuffer, fx->dof_far_blur);
|
||||||
|
numslots = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* third pass, accumulate the near/far blur fields */
|
/* third pass, accumulate the near/far blur fields */
|
||||||
@@ -1040,7 +1042,7 @@ bool GPU_fx_do_composite_pass(
|
|||||||
|
|
||||||
GPUDOFHQPassThreeInterface *interface = GPU_fx_shader_get_interface(dof_shader_pass3);
|
GPUDOFHQPassThreeInterface *interface = GPU_fx_shader_get_interface(dof_shader_pass3);
|
||||||
|
|
||||||
GPU_shader_bind(dof_shader_pass3);
|
Batch_set_program(fx->quad_batch, GPU_shader_get_program(dof_shader_pass3));
|
||||||
|
|
||||||
GPU_shader_uniform_vector(dof_shader_pass3, interface->dof_uniform, 4, 1, dof_params);
|
GPU_shader_uniform_vector(dof_shader_pass3, interface->dof_uniform, 4, 1, dof_params);
|
||||||
|
|
||||||
@@ -1066,7 +1068,7 @@ bool GPU_fx_do_composite_pass(
|
|||||||
/* if this is the last pass, prepare for rendering on the frambuffer */
|
/* if this is the last pass, prepare for rendering on the frambuffer */
|
||||||
gpu_fx_bind_render_target(&passes_left, fx, ofs, target);
|
gpu_fx_bind_render_target(&passes_left, fx, ofs, target);
|
||||||
|
|
||||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
Batch_draw(fx->quad_batch);
|
||||||
|
|
||||||
/* disable bindings */
|
/* disable bindings */
|
||||||
GPU_texture_unbind(fx->dof_near_blur);
|
GPU_texture_unbind(fx->dof_near_blur);
|
||||||
@@ -1108,11 +1110,8 @@ bool GPU_fx_do_composite_pass(
|
|||||||
if (!(dof_shader_pass1 && dof_shader_pass2 && dof_shader_pass3 && dof_shader_pass4 && dof_shader_pass5)) {
|
if (!(dof_shader_pass1 && dof_shader_pass2 && dof_shader_pass3 && dof_shader_pass4 && dof_shader_pass5)) {
|
||||||
GPU_framebuffer_texture_unbind(fx->gbuffer, NULL);
|
GPU_framebuffer_texture_unbind(fx->gbuffer, NULL);
|
||||||
GPU_framebuffer_restore();
|
GPU_framebuffer_restore();
|
||||||
glDisableClientState(GL_VERTEX_ARRAY);
|
|
||||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
||||||
|
|
||||||
GPU_shader_unbind();
|
GPU_shader_unbind();
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1122,7 +1121,7 @@ bool GPU_fx_do_composite_pass(
|
|||||||
|
|
||||||
GPUDOFPassOneInterface *interface = GPU_fx_shader_get_interface(dof_shader_pass1);
|
GPUDOFPassOneInterface *interface = GPU_fx_shader_get_interface(dof_shader_pass1);
|
||||||
|
|
||||||
GPU_shader_bind(dof_shader_pass1);
|
Batch_set_program(fx->quad_batch, GPU_shader_get_program(dof_shader_pass1));
|
||||||
|
|
||||||
GPU_shader_uniform_vector(dof_shader_pass1, interface->dof_uniform, 4, 1, dof_params);
|
GPU_shader_uniform_vector(dof_shader_pass1, interface->dof_uniform, 4, 1, dof_params);
|
||||||
GPU_shader_uniform_vector(dof_shader_pass1, interface->invrendertargetdim_uniform, 2, 1, invrendertargetdim);
|
GPU_shader_uniform_vector(dof_shader_pass1, interface->invrendertargetdim_uniform, 2, 1, invrendertargetdim);
|
||||||
@@ -1141,7 +1140,7 @@ bool GPU_fx_do_composite_pass(
|
|||||||
/* binding takes care of setting the viewport to the downsampled size */
|
/* binding takes care of setting the viewport to the downsampled size */
|
||||||
GPU_texture_bind_as_framebuffer(fx->dof_near_coc_buffer);
|
GPU_texture_bind_as_framebuffer(fx->dof_near_coc_buffer);
|
||||||
|
|
||||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
Batch_draw(fx->quad_batch);
|
||||||
/* disable bindings */
|
/* disable bindings */
|
||||||
GPU_texture_unbind(src);
|
GPU_texture_unbind(src);
|
||||||
GPU_texture_compare_mode(fx->depth_buffer, true);
|
GPU_texture_compare_mode(fx->depth_buffer, true);
|
||||||
@@ -1164,7 +1163,7 @@ bool GPU_fx_do_composite_pass(
|
|||||||
dof_params[2] = GPU_texture_width(fx->dof_near_coc_blurred_buffer) / (scale_camera * fx_dof->sensor);
|
dof_params[2] = GPU_texture_width(fx->dof_near_coc_blurred_buffer) / (scale_camera * fx_dof->sensor);
|
||||||
|
|
||||||
/* Blurring vertically */
|
/* Blurring vertically */
|
||||||
GPU_shader_bind(dof_shader_pass2);
|
Batch_set_program(fx->quad_batch, GPU_shader_get_program(dof_shader_pass2));
|
||||||
|
|
||||||
GPU_shader_uniform_vector(dof_shader_pass2, interface->dof_uniform, 4, 1, dof_params);
|
GPU_shader_uniform_vector(dof_shader_pass2, interface->dof_uniform, 4, 1, dof_params);
|
||||||
GPU_shader_uniform_vector(dof_shader_pass2, interface->invrendertargetdim_uniform, 2, 1, invrendertargetdim);
|
GPU_shader_uniform_vector(dof_shader_pass2, interface->invrendertargetdim_uniform, 2, 1, invrendertargetdim);
|
||||||
@@ -1182,10 +1181,14 @@ bool GPU_fx_do_composite_pass(
|
|||||||
GPU_framebuffer_texture_attach(fx->gbuffer, fx->dof_near_coc_final_buffer, 0);
|
GPU_framebuffer_texture_attach(fx->gbuffer, fx->dof_near_coc_final_buffer, 0);
|
||||||
|
|
||||||
/* Drawing quad */
|
/* Drawing quad */
|
||||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
Batch_draw(fx->quad_batch);
|
||||||
|
|
||||||
|
/* Rebind Shader */
|
||||||
|
Batch_set_program(fx->quad_batch, GPU_shader_get_program(dof_shader_pass2));
|
||||||
|
|
||||||
/* *unbind/detach */
|
/* *unbind/detach */
|
||||||
GPU_texture_unbind(fx->dof_near_coc_buffer);
|
GPU_texture_unbind(fx->dof_near_coc_buffer);
|
||||||
|
|
||||||
GPU_framebuffer_texture_detach(fx->dof_near_coc_final_buffer);
|
GPU_framebuffer_texture_detach(fx->dof_near_coc_final_buffer);
|
||||||
|
|
||||||
/* Blurring horizontally */
|
/* Blurring horizontally */
|
||||||
@@ -1197,7 +1200,8 @@ bool GPU_fx_do_composite_pass(
|
|||||||
GPU_shader_uniform_texture(dof_shader_pass2, interface->color_uniform, fx->dof_near_coc_final_buffer);
|
GPU_shader_uniform_texture(dof_shader_pass2, interface->color_uniform, fx->dof_near_coc_final_buffer);
|
||||||
|
|
||||||
GPU_framebuffer_texture_attach(fx->gbuffer, fx->dof_near_coc_blurred_buffer, 0);
|
GPU_framebuffer_texture_attach(fx->gbuffer, fx->dof_near_coc_blurred_buffer, 0);
|
||||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
|
||||||
|
Batch_draw(fx->quad_batch);
|
||||||
|
|
||||||
/* *unbind/detach */
|
/* *unbind/detach */
|
||||||
GPU_texture_compare_mode(fx->depth_buffer, true);
|
GPU_texture_compare_mode(fx->depth_buffer, true);
|
||||||
@@ -1216,7 +1220,7 @@ bool GPU_fx_do_composite_pass(
|
|||||||
{
|
{
|
||||||
GPUDOFPassThreeInterface *interface = GPU_fx_shader_get_interface(dof_shader_pass3);
|
GPUDOFPassThreeInterface *interface = GPU_fx_shader_get_interface(dof_shader_pass3);
|
||||||
|
|
||||||
GPU_shader_bind(dof_shader_pass3);
|
Batch_set_program(fx->quad_batch, GPU_shader_get_program(dof_shader_pass3));
|
||||||
|
|
||||||
GPU_texture_bind(fx->dof_near_coc_buffer, numslots++);
|
GPU_texture_bind(fx->dof_near_coc_buffer, numslots++);
|
||||||
GPU_shader_uniform_texture(dof_shader_pass3, interface->near_coc_downsampled, fx->dof_near_coc_buffer);
|
GPU_shader_uniform_texture(dof_shader_pass3, interface->near_coc_downsampled, fx->dof_near_coc_buffer);
|
||||||
@@ -1226,7 +1230,7 @@ bool GPU_fx_do_composite_pass(
|
|||||||
|
|
||||||
GPU_framebuffer_texture_attach(fx->gbuffer, fx->dof_near_coc_final_buffer, 0);
|
GPU_framebuffer_texture_attach(fx->gbuffer, fx->dof_near_coc_final_buffer, 0);
|
||||||
|
|
||||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
Batch_draw(fx->quad_batch);
|
||||||
/* disable bindings */
|
/* disable bindings */
|
||||||
GPU_texture_unbind(fx->dof_near_coc_buffer);
|
GPU_texture_unbind(fx->dof_near_coc_buffer);
|
||||||
GPU_texture_unbind(fx->dof_near_coc_blurred_buffer);
|
GPU_texture_unbind(fx->dof_near_coc_blurred_buffer);
|
||||||
@@ -1244,7 +1248,7 @@ bool GPU_fx_do_composite_pass(
|
|||||||
|
|
||||||
GPUDOFPassFourInterface *interface = GPU_fx_shader_get_interface(dof_shader_pass4);
|
GPUDOFPassFourInterface *interface = GPU_fx_shader_get_interface(dof_shader_pass4);
|
||||||
|
|
||||||
GPU_shader_bind(dof_shader_pass4);
|
Batch_set_program(fx->quad_batch, GPU_shader_get_program(dof_shader_pass4));
|
||||||
|
|
||||||
GPU_texture_bind(fx->dof_near_coc_final_buffer, numslots++);
|
GPU_texture_bind(fx->dof_near_coc_final_buffer, numslots++);
|
||||||
GPU_shader_uniform_texture(dof_shader_pass4, interface->near_coc_downsampled, fx->dof_near_coc_final_buffer);
|
GPU_shader_uniform_texture(dof_shader_pass4, interface->near_coc_downsampled, fx->dof_near_coc_final_buffer);
|
||||||
@@ -1252,7 +1256,7 @@ bool GPU_fx_do_composite_pass(
|
|||||||
|
|
||||||
GPU_framebuffer_texture_attach(fx->gbuffer, fx->dof_near_coc_buffer, 0);
|
GPU_framebuffer_texture_attach(fx->gbuffer, fx->dof_near_coc_buffer, 0);
|
||||||
|
|
||||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
Batch_draw(fx->quad_batch);
|
||||||
/* disable bindings */
|
/* disable bindings */
|
||||||
GPU_texture_unbind(fx->dof_near_coc_final_buffer);
|
GPU_texture_unbind(fx->dof_near_coc_final_buffer);
|
||||||
|
|
||||||
@@ -1269,7 +1273,7 @@ bool GPU_fx_do_composite_pass(
|
|||||||
|
|
||||||
GPUDOFPassFiveInterface *interface = GPU_fx_shader_get_interface(dof_shader_pass5);
|
GPUDOFPassFiveInterface *interface = GPU_fx_shader_get_interface(dof_shader_pass5);
|
||||||
|
|
||||||
GPU_shader_bind(dof_shader_pass5);
|
Batch_set_program(fx->quad_batch, GPU_shader_get_program(dof_shader_pass5));
|
||||||
|
|
||||||
GPU_shader_uniform_vector(dof_shader_pass5, interface->dof_uniform, 4, 1, dof_params);
|
GPU_shader_uniform_vector(dof_shader_pass5, interface->dof_uniform, 4, 1, dof_params);
|
||||||
GPU_shader_uniform_vector(dof_shader_pass5, interface->invrendertargetdim_uniform, 2, 1, invrendertargetdim);
|
GPU_shader_uniform_vector(dof_shader_pass5, interface->invrendertargetdim_uniform, 2, 1, invrendertargetdim);
|
||||||
@@ -1292,7 +1296,7 @@ bool GPU_fx_do_composite_pass(
|
|||||||
/* if this is the last pass, prepare for rendering on the frambuffer */
|
/* if this is the last pass, prepare for rendering on the frambuffer */
|
||||||
gpu_fx_bind_render_target(&passes_left, fx, ofs, target);
|
gpu_fx_bind_render_target(&passes_left, fx, ofs, target);
|
||||||
|
|
||||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
Batch_draw(fx->quad_batch);
|
||||||
/* disable bindings */
|
/* disable bindings */
|
||||||
GPU_texture_unbind(fx->dof_near_coc_buffer);
|
GPU_texture_unbind(fx->dof_near_coc_buffer);
|
||||||
GPU_texture_unbind(fx->dof_near_coc_blurred_buffer);
|
GPU_texture_unbind(fx->dof_near_coc_blurred_buffer);
|
||||||
@@ -1318,10 +1322,6 @@ bool GPU_fx_do_composite_pass(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
glDisableClientState(GL_VERTEX_ARRAY);
|
|
||||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
|
||||||
|
|
||||||
GPU_shader_unbind();
|
GPU_shader_unbind();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -1,5 +1,10 @@
|
|||||||
uniform sampler2D depthbuffer;
|
uniform sampler2D depthbuffer;
|
||||||
varying vec4 uvcoordsvar;
|
|
||||||
|
#if __VERSION__ == 120
|
||||||
|
varying vec4 uvcoordsvar;
|
||||||
|
#else
|
||||||
|
in vec4 uvcoordsvar;
|
||||||
|
#endif
|
||||||
|
|
||||||
void main(void)
|
void main(void)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -16,17 +16,35 @@ uniform vec4 dof_params;
|
|||||||
// viewvectors for reconstruction of world space
|
// viewvectors for reconstruction of world space
|
||||||
uniform vec4 viewvecs[3];
|
uniform vec4 viewvecs[3];
|
||||||
|
|
||||||
// coordinates on framebuffer in normalized (0.0-1.0) uv space
|
#if __VERSION__ == 120
|
||||||
varying vec4 uvcoordsvar;
|
// coordinates on framebuffer in normalized (0.0-1.0) uv space
|
||||||
|
varying vec4 uvcoordsvar;
|
||||||
|
|
||||||
/* color texture coordinates, offset by a small amount */
|
/* color texture coordinates, offset by a small amount */
|
||||||
varying vec2 color_uv1;
|
varying vec2 color_uv1;
|
||||||
varying vec2 color_uv2;
|
varying vec2 color_uv2;
|
||||||
|
|
||||||
varying vec2 depth_uv1;
|
varying vec2 depth_uv1;
|
||||||
varying vec2 depth_uv2;
|
varying vec2 depth_uv2;
|
||||||
varying vec2 depth_uv3;
|
varying vec2 depth_uv3;
|
||||||
varying vec2 depth_uv4;
|
varying vec2 depth_uv4;
|
||||||
|
|
||||||
|
#define FragColor gl_FragColor
|
||||||
|
#else
|
||||||
|
// coordinates on framebuffer in normalized (0.0-1.0) uv space
|
||||||
|
in vec4 uvcoordsvar;
|
||||||
|
|
||||||
|
/* color texture coordinates, offset by a small amount */
|
||||||
|
in vec2 color_uv1;
|
||||||
|
in vec2 color_uv2;
|
||||||
|
|
||||||
|
in vec2 depth_uv1;
|
||||||
|
in vec2 depth_uv2;
|
||||||
|
in vec2 depth_uv3;
|
||||||
|
in vec2 depth_uv4;
|
||||||
|
|
||||||
|
out vec4 FragColor;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
float calculate_far_coc(in float zdepth)
|
float calculate_far_coc(in float zdepth)
|
||||||
@@ -102,7 +120,7 @@ void first_pass()
|
|||||||
coc = max(calculate_near_coc(zdepth), coc);
|
coc = max(calculate_near_coc(zdepth), coc);
|
||||||
|
|
||||||
final_coc = max(max(coc.x, coc.y), max(coc.z, coc.w));
|
final_coc = max(max(coc.x, coc.y), max(coc.z, coc.w));
|
||||||
gl_FragColor = vec4(color.rgb, final_coc);
|
FragColor = vec4(color.rgb, final_coc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* second pass, gaussian blur the downsampled image */
|
/* second pass, gaussian blur the downsampled image */
|
||||||
@@ -119,7 +137,7 @@ void second_pass()
|
|||||||
color += texture2D(colorbuffer, uvcoordsvar.xy - 2.5 * invrendertargetdim) * 0.09375;
|
color += texture2D(colorbuffer, uvcoordsvar.xy - 2.5 * invrendertargetdim) * 0.09375;
|
||||||
color += texture2D(colorbuffer, uvcoordsvar.xy - 4.5 * invrendertargetdim) * 0.015625;
|
color += texture2D(colorbuffer, uvcoordsvar.xy - 4.5 * invrendertargetdim) * 0.015625;
|
||||||
|
|
||||||
gl_FragColor = color;
|
FragColor = color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -129,7 +147,7 @@ void third_pass()
|
|||||||
vec4 color = texture2D(colorbuffer, uvcoordsvar.xy);
|
vec4 color = texture2D(colorbuffer, uvcoordsvar.xy);
|
||||||
vec4 color_blurred = texture2D(blurredcolorbuffer, uvcoordsvar.xy);
|
vec4 color_blurred = texture2D(blurredcolorbuffer, uvcoordsvar.xy);
|
||||||
float coc = 2.0 * max(color_blurred.a, color.a); -color.a;
|
float coc = 2.0 * max(color_blurred.a, color.a); -color.a;
|
||||||
gl_FragColor = vec4(color.rgb, coc);
|
FragColor = vec4(color.rgb, coc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -141,7 +159,7 @@ void fourth_pass()
|
|||||||
color += texture2D(colorbuffer, uvcoordsvar.xw);
|
color += texture2D(colorbuffer, uvcoordsvar.xw);
|
||||||
color += texture2D(colorbuffer, uvcoordsvar.yw);
|
color += texture2D(colorbuffer, uvcoordsvar.yw);
|
||||||
|
|
||||||
gl_FragColor = color / 4.0;
|
FragColor = color / 4.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
vec4 small_sample_blur(in sampler2D colorbuffer, in vec2 uv, in vec4 color)
|
vec4 small_sample_blur(in sampler2D colorbuffer, in vec2 uv, in vec4 color)
|
||||||
@@ -188,7 +206,7 @@ void fifth_pass()
|
|||||||
color /= dot(factors, vec4(1.0));
|
color /= dot(factors, vec4(1.0));
|
||||||
/* using original color is not correct, but use that for now because alpha of
|
/* using original color is not correct, but use that for now because alpha of
|
||||||
* blurred buffers uses CoC instead */
|
* blurred buffers uses CoC instead */
|
||||||
gl_FragColor = vec4(color.rgb, color_orig.a);
|
FragColor = vec4(color.rgb, color_orig.a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -20,18 +20,42 @@ uniform vec4 dof_params;
|
|||||||
/* viewvectors for reconstruction of world space */
|
/* viewvectors for reconstruction of world space */
|
||||||
uniform vec4 viewvecs[3];
|
uniform vec4 viewvecs[3];
|
||||||
|
|
||||||
/* initial uv coordinate */
|
#if __VERSION__ == 120
|
||||||
varying vec2 uvcoord;
|
/* initial uv coordinate */
|
||||||
|
varying vec2 uvcoord;
|
||||||
|
|
||||||
/* coordinate used for calculating radius et al set in geometry shader */
|
/* coordinate used for calculating radius et al set in geometry shader */
|
||||||
varying vec2 particlecoord;
|
varying vec2 particlecoord;
|
||||||
varying vec4 color;
|
varying vec4 color;
|
||||||
|
|
||||||
|
/* downsampling coordinates */
|
||||||
|
varying vec2 downsample1;
|
||||||
|
varying vec2 downsample2;
|
||||||
|
varying vec2 downsample3;
|
||||||
|
varying vec2 downsample4;
|
||||||
|
|
||||||
|
#define fragData0 gl_FragData[0]
|
||||||
|
#define fragData1 gl_FragData[1]
|
||||||
|
#define fragData2 gl_FragData[2]
|
||||||
|
#else
|
||||||
|
/* initial uv coordinate */
|
||||||
|
in vec2 uvcoord;
|
||||||
|
|
||||||
|
/* coordinate used for calculating radius et al set in geometry shader */
|
||||||
|
in vec2 particlecoord;
|
||||||
|
flat in vec4 color;
|
||||||
|
|
||||||
|
/* downsampling coordinates */
|
||||||
|
in vec2 downsample1;
|
||||||
|
in vec2 downsample2;
|
||||||
|
in vec2 downsample3;
|
||||||
|
in vec2 downsample4;
|
||||||
|
|
||||||
|
layout(location = 0) out vec4 fragData0;
|
||||||
|
layout(location = 1) out vec4 fragData1;
|
||||||
|
layout(location = 2) out vec4 fragData2;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* downsampling coordinates */
|
|
||||||
varying vec2 downsample1;
|
|
||||||
varying vec2 downsample2;
|
|
||||||
varying vec2 downsample3;
|
|
||||||
varying vec2 downsample4;
|
|
||||||
|
|
||||||
#define M_PI 3.1415926535897932384626433832795
|
#define M_PI 3.1415926535897932384626433832795
|
||||||
|
|
||||||
@@ -82,16 +106,16 @@ void downsample_pass()
|
|||||||
float norm_far = dot(far_weights, vec4(1.0));
|
float norm_far = dot(far_weights, vec4(1.0));
|
||||||
|
|
||||||
/* now write output to weighted buffers. */
|
/* now write output to weighted buffers. */
|
||||||
gl_FragData[0] = color1 * near_weights.x + color2 * near_weights.y + color3 * near_weights.z +
|
fragData0 = color1 * near_weights.x + color2 * near_weights.y + color3 * near_weights.z +
|
||||||
color4 * near_weights.w;
|
color4 * near_weights.w;
|
||||||
gl_FragData[1] = color1 * far_weights.x + color2 * far_weights.y + color3 * far_weights.z +
|
fragData1 = color1 * far_weights.x + color2 * far_weights.y + color3 * far_weights.z +
|
||||||
color4 * far_weights.w;
|
color4 * far_weights.w;
|
||||||
|
|
||||||
if (norm_near > 0.0)
|
if (norm_near > 0.0)
|
||||||
gl_FragData[0] /= norm_near;
|
fragData0 /= norm_near;
|
||||||
if (norm_far > 0.0)
|
if (norm_far > 0.0)
|
||||||
gl_FragData[1] /= norm_far;
|
fragData1 /= norm_far;
|
||||||
gl_FragData[2] = vec4(near_coc, far_coc, 0.0, 1.0);
|
fragData2 = vec4(near_coc, far_coc, 0.0, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* accumulate color in the near/far blur buffers */
|
/* accumulate color in the near/far blur buffers */
|
||||||
@@ -102,16 +126,16 @@ void accumulate_pass(void) {
|
|||||||
if (dof_params.w == 0.0)
|
if (dof_params.w == 0.0)
|
||||||
r = 1.0;
|
r = 1.0;
|
||||||
else
|
else
|
||||||
r = cos(M_PI / dof_params.w) /
|
r = cos(M_PI / dof_params.w) /
|
||||||
(cos(theta - (2.0 * M_PI / dof_params.w) * floor((dof_params.w * theta + M_PI) / (2.0 * M_PI))));
|
(cos(theta - (2.0 * M_PI / dof_params.w) * floor((dof_params.w * theta + M_PI) / (2.0 * M_PI))));
|
||||||
|
|
||||||
if (dot(particlecoord, particlecoord) > r * r)
|
if (dot(particlecoord, particlecoord) > r * r)
|
||||||
discard;
|
discard;
|
||||||
|
|
||||||
gl_FragData[0] = color;
|
fragData0 = color;
|
||||||
}
|
}
|
||||||
#define MERGE_THRESHOLD 4.0
|
|
||||||
|
|
||||||
|
#define MERGE_THRESHOLD 4.0
|
||||||
/* combine the passes, */
|
/* combine the passes, */
|
||||||
void final_pass(void) {
|
void final_pass(void) {
|
||||||
vec4 finalcolor;
|
vec4 finalcolor;
|
||||||
@@ -152,7 +176,9 @@ void final_pass(void) {
|
|||||||
finalcolor = mix(finalcolor, nearcolor, nearweight / totalweight);
|
finalcolor = mix(finalcolor, nearcolor, nearweight / totalweight);
|
||||||
}
|
}
|
||||||
|
|
||||||
gl_FragData[0] = finalcolor;
|
fragData0 = finalcolor;
|
||||||
|
// fragData0 = vec4(nearweight, farweight, 0.0, 1.0);
|
||||||
|
// fragData0 = vec4(nearcolor.rgb, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ uniform sampler2D cocbuffer;
|
|||||||
#else
|
#else
|
||||||
in vec2 uvcoord[];
|
in vec2 uvcoord[];
|
||||||
out vec2 particlecoord;
|
out vec2 particlecoord;
|
||||||
out vec4 color;
|
flat out vec4 color;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define M_PI 3.1415926535897932384626433832795
|
#define M_PI 3.1415926535897932384626433832795
|
||||||
@@ -46,21 +46,23 @@ void main()
|
|||||||
|
|
||||||
vec2 offset_far = vec2(offset_val * 0.5) / vec2(rendertargetdim.x, rendertargetdim.y);
|
vec2 offset_far = vec2(offset_val * 0.5) / vec2(rendertargetdim.x, rendertargetdim.y);
|
||||||
|
|
||||||
gl_Position = POS + vec4(-offset_far.x, -offset_far.y, 0.0, 0.0);
|
|
||||||
color = colortex;
|
color = colortex;
|
||||||
|
|
||||||
|
gl_Position = POS + vec4(-offset_far.x, -offset_far.y, 0.0, 0.0);
|
||||||
particlecoord = vec2(-1.0, -1.0);
|
particlecoord = vec2(-1.0, -1.0);
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
|
||||||
gl_Position = POS + vec4(-offset_far.x, offset_far.y, 0.0, 0.0);
|
gl_Position = POS + vec4(-offset_far.x, offset_far.y, 0.0, 0.0);
|
||||||
particlecoord = vec2(-1.0, 1.0);
|
particlecoord = vec2(-1.0, 1.0);
|
||||||
color = colortex;
|
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
|
||||||
gl_Position = POS + vec4(offset_far.x, -offset_far.y, 0.0, 0.0);
|
gl_Position = POS + vec4(offset_far.x, -offset_far.y, 0.0, 0.0);
|
||||||
particlecoord = vec2(1.0, -1.0);
|
particlecoord = vec2(1.0, -1.0);
|
||||||
color = colortex;
|
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
|
||||||
gl_Position = POS + vec4(offset_far.x, offset_far.y, 0.0, 0.0);
|
gl_Position = POS + vec4(offset_far.x, offset_far.y, 0.0, 0.0);
|
||||||
particlecoord = vec2(1.0, 1.0);
|
particlecoord = vec2(1.0, 1.0);
|
||||||
color = colortex;
|
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
|
||||||
EndPrimitive();
|
EndPrimitive();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,27 +1,47 @@
|
|||||||
|
|
||||||
|
#if __VERSION__ == 120
|
||||||
|
attribute vec2 pos;
|
||||||
|
attribute vec2 uvs;
|
||||||
|
/* initial uv coordinate */
|
||||||
|
varying vec2 uvcoord;
|
||||||
|
|
||||||
|
/* coordinate used for calculating radius et al set in geometry shader */
|
||||||
|
varying vec2 particlecoord;
|
||||||
|
|
||||||
|
/* downsampling coordinates */
|
||||||
|
varying vec2 downsample1;
|
||||||
|
varying vec2 downsample2;
|
||||||
|
varying vec2 downsample3;
|
||||||
|
varying vec2 downsample4;
|
||||||
|
#else
|
||||||
|
in vec2 pos;
|
||||||
|
in vec2 uvs;
|
||||||
|
/* initial uv coordinate */
|
||||||
|
out vec2 uvcoord;
|
||||||
|
|
||||||
|
/* coordinate used for calculating radius et al set in geometry shader */
|
||||||
|
out vec2 particlecoord;
|
||||||
|
|
||||||
|
/* downsampling coordinates */
|
||||||
|
out vec2 downsample1;
|
||||||
|
out vec2 downsample2;
|
||||||
|
out vec2 downsample3;
|
||||||
|
out vec2 downsample4;
|
||||||
|
#endif
|
||||||
|
|
||||||
uniform vec2 invrendertargetdim;
|
uniform vec2 invrendertargetdim;
|
||||||
uniform ivec2 rendertargetdim;
|
uniform ivec2 rendertargetdim;
|
||||||
/* initial uv coordinate */
|
|
||||||
varying vec2 uvcoord;
|
|
||||||
|
|
||||||
/* coordinate used for calculating radius et al set in geometry shader */
|
|
||||||
varying vec2 particlecoord;
|
|
||||||
|
|
||||||
/* downsampling coordinates */
|
|
||||||
varying vec2 downsample1;
|
|
||||||
varying vec2 downsample2;
|
|
||||||
varying vec2 downsample3;
|
|
||||||
varying vec2 downsample4;
|
|
||||||
|
|
||||||
void vert_dof_downsample()
|
void vert_dof_downsample()
|
||||||
{
|
{
|
||||||
/* gather pixels from neighbors. half dimensions means we offset half a pixel to
|
/* gather pixels from neighbors. half dimensions means we offset half a pixel to
|
||||||
* get this right though it's possible we may lose a pixel at some point */
|
* get this right though it's possible we may lose a pixel at some point */
|
||||||
downsample1 = gl_MultiTexCoord0.xy + vec2(-0.5, -0.5) * invrendertargetdim;
|
downsample1 = uvs.xy + vec2(-0.5, -0.5) * invrendertargetdim;
|
||||||
downsample2 = gl_MultiTexCoord0.xy + vec2(-0.5, 0.5) * invrendertargetdim;
|
downsample2 = uvs.xy + vec2(-0.5, 0.5) * invrendertargetdim;
|
||||||
downsample3 = gl_MultiTexCoord0.xy + vec2(0.5, 0.5) * invrendertargetdim;
|
downsample3 = uvs.xy + vec2(0.5, 0.5) * invrendertargetdim;
|
||||||
downsample4 = gl_MultiTexCoord0.xy + vec2(0.5, -0.5) * invrendertargetdim;
|
downsample4 = uvs.xy + vec2(0.5, -0.5) * invrendertargetdim;
|
||||||
|
|
||||||
gl_Position = gl_Vertex;
|
gl_Position = vec4(pos, 0.0, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* geometry shading pass, calculate a texture coordinate based on the indexed id */
|
/* geometry shading pass, calculate a texture coordinate based on the indexed id */
|
||||||
@@ -42,8 +62,8 @@ void vert_dof_coc_scatter_pass()
|
|||||||
|
|
||||||
void vert_dof_final()
|
void vert_dof_final()
|
||||||
{
|
{
|
||||||
uvcoord = gl_MultiTexCoord0.xy;
|
uvcoord = uvs;
|
||||||
gl_Position = gl_Vertex;
|
gl_Position = vec4(pos, 0.0, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
|
|||||||
@@ -1,51 +1,72 @@
|
|||||||
uniform vec2 invrendertargetdim;
|
uniform vec2 invrendertargetdim;
|
||||||
|
|
||||||
//texture coordinates for framebuffer read
|
|
||||||
varying vec4 uvcoordsvar;
|
|
||||||
|
|
||||||
/* color texture coordinates, offset by a small amount */
|
#if __VERSION__ == 120
|
||||||
varying vec2 color_uv1;
|
attribute vec2 pos;
|
||||||
varying vec2 color_uv2;
|
attribute vec2 uvs;
|
||||||
|
|
||||||
varying vec2 depth_uv1;
|
//texture coordinates for framebuffer read
|
||||||
varying vec2 depth_uv2;
|
varying vec4 uvcoordsvar;
|
||||||
varying vec2 depth_uv3;
|
|
||||||
varying vec2 depth_uv4;
|
/* color texture coordinates, offset by a small amount */
|
||||||
|
varying vec2 color_uv1;
|
||||||
|
varying vec2 color_uv2;
|
||||||
|
|
||||||
|
varying vec2 depth_uv1;
|
||||||
|
varying vec2 depth_uv2;
|
||||||
|
varying vec2 depth_uv3;
|
||||||
|
varying vec2 depth_uv4;
|
||||||
|
#else
|
||||||
|
in vec2 pos;
|
||||||
|
in vec2 uvs;
|
||||||
|
|
||||||
|
//texture coordinates for framebuffer read
|
||||||
|
out vec4 uvcoordsvar;
|
||||||
|
|
||||||
|
/* color texture coordinates, offset by a small amount */
|
||||||
|
out vec2 color_uv1;
|
||||||
|
out vec2 color_uv2;
|
||||||
|
|
||||||
|
out vec2 depth_uv1;
|
||||||
|
out vec2 depth_uv2;
|
||||||
|
out vec2 depth_uv3;
|
||||||
|
out vec2 depth_uv4;
|
||||||
|
#endif
|
||||||
|
|
||||||
//very simple shader for gull screen FX, just pass values on
|
//very simple shader for gull screen FX, just pass values on
|
||||||
|
|
||||||
void vert_generic()
|
void vert_generic()
|
||||||
{
|
{
|
||||||
uvcoordsvar = gl_MultiTexCoord0;
|
uvcoordsvar = vec4(uvs, 0.0, 0.0);
|
||||||
gl_Position = gl_Vertex;
|
gl_Position = vec4(pos, 0.0, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vert_dof_first_pass()
|
void vert_dof_first_pass()
|
||||||
{
|
{
|
||||||
/* we offset the texture coordinates by 1.5 pixel,
|
/* we offset the texture coordinates by 1.5 pixel,
|
||||||
* then we reuse that to sample the surrounding pixels */
|
* then we reuse that to sample the surrounding pixels */
|
||||||
color_uv1 = gl_MultiTexCoord0.xy + vec2(-1.5, -1.5) * invrendertargetdim;
|
color_uv1 = uvs.xy + vec2(-1.5, -1.5) * invrendertargetdim;
|
||||||
color_uv2 = gl_MultiTexCoord0.xy + vec2(0.5, -1.5) * invrendertargetdim;
|
color_uv2 = uvs.xy + vec2(0.5, -1.5) * invrendertargetdim;
|
||||||
|
|
||||||
depth_uv1 = gl_MultiTexCoord0.xy + vec2(-1.5, -1.5) * invrendertargetdim;
|
depth_uv1 = uvs.xy + vec2(-1.5, -1.5) * invrendertargetdim;
|
||||||
depth_uv2 = gl_MultiTexCoord0.xy + vec2(-0.5, -1.5) * invrendertargetdim;
|
depth_uv2 = uvs.xy + vec2(-0.5, -1.5) * invrendertargetdim;
|
||||||
depth_uv3 = gl_MultiTexCoord0.xy + vec2(0.5, -1.5) * invrendertargetdim;
|
depth_uv3 = uvs.xy + vec2(0.5, -1.5) * invrendertargetdim;
|
||||||
depth_uv4 = gl_MultiTexCoord0.xy + vec2(1.5, -1.5) * invrendertargetdim;
|
depth_uv4 = uvs.xy + vec2(1.5, -1.5) * invrendertargetdim;
|
||||||
|
|
||||||
gl_Position = gl_Vertex;
|
gl_Position = vec4(pos, 0.0, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vert_dof_fourth_pass()
|
void vert_dof_fourth_pass()
|
||||||
{
|
{
|
||||||
vec4 halfpixel = vec4(-0.5, 0.5, -0.5, 0.5);
|
vec4 halfpixel = vec4(-0.5, 0.5, -0.5, 0.5);
|
||||||
uvcoordsvar = gl_MultiTexCoord0.xxyy +
|
uvcoordsvar = uvs.xxyy +
|
||||||
halfpixel *
|
halfpixel *
|
||||||
vec4(invrendertargetdim.x,
|
vec4(invrendertargetdim.x,
|
||||||
invrendertargetdim.x,
|
invrendertargetdim.x,
|
||||||
invrendertargetdim.y,
|
invrendertargetdim.y,
|
||||||
invrendertargetdim.y);
|
invrendertargetdim.y);
|
||||||
|
|
||||||
gl_Position = gl_Vertex;
|
gl_Position = vec4(pos, 0.0, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vert_dof_fifth_pass()
|
void vert_dof_fifth_pass()
|
||||||
@@ -53,8 +74,8 @@ void vert_dof_fifth_pass()
|
|||||||
vec4 halfpixel = vec4(-0.5, 0.5, -0.5, 0.5);
|
vec4 halfpixel = vec4(-0.5, 0.5, -0.5, 0.5);
|
||||||
color_uv1 = vec2(0.5, 1.5) * invrendertargetdim;
|
color_uv1 = vec2(0.5, 1.5) * invrendertargetdim;
|
||||||
|
|
||||||
uvcoordsvar = gl_MultiTexCoord0;
|
uvcoordsvar = vec4(uvs, 0.0, 0.0);
|
||||||
gl_Position = gl_Vertex;
|
gl_Position = vec4(pos, 0.0, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
|
|||||||
@@ -1,14 +1,17 @@
|
|||||||
|
uniform mat4 ProjectionMatrix;
|
||||||
|
|
||||||
/* simple depth reconstruction, see http://www.derschmale.com/2014/01/26/reconstructing-positions-from-the-depth-buffer
|
/* simple depth reconstruction, see http://www.derschmale.com/2014/01/26/reconstructing-positions-from-the-depth-buffer
|
||||||
* we change the factors from the article to fit the OpennGL model. */
|
* we change the factors from the article to fit the OpennGL model. */
|
||||||
#ifdef PERSP_MATRIX
|
#ifdef PERSP_MATRIX
|
||||||
|
|
||||||
|
|
||||||
/* perspective camera code */
|
/* perspective camera code */
|
||||||
|
|
||||||
vec3 get_view_space_from_depth(in vec2 uvcoords, in vec3 viewvec_origin, in vec3 viewvec_diff, in float depth)
|
vec3 get_view_space_from_depth(in vec2 uvcoords, in vec3 viewvec_origin, in vec3 viewvec_diff, in float depth)
|
||||||
{
|
{
|
||||||
float d = 2.0 * depth - 1.0;
|
float d = 2.0 * depth - 1.0;
|
||||||
|
|
||||||
float zview = -gl_ProjectionMatrix[3][2] / (d + gl_ProjectionMatrix[2][2]);
|
float zview = -ProjectionMatrix[3][2] / (d + ProjectionMatrix[2][2]);
|
||||||
|
|
||||||
return zview * (viewvec_origin + vec3(uvcoords, 0.0) * viewvec_diff);
|
return zview * (viewvec_origin + vec3(uvcoords, 0.0) * viewvec_diff);
|
||||||
}
|
}
|
||||||
@@ -18,7 +21,7 @@ vec4 get_view_space_z_from_depth(in vec4 near, in vec4 range, in vec4 depth)
|
|||||||
vec4 d = 2.0 * depth - vec4(1.0);
|
vec4 d = 2.0 * depth - vec4(1.0);
|
||||||
|
|
||||||
/* return positive value, so sign differs! */
|
/* return positive value, so sign differs! */
|
||||||
return vec4(gl_ProjectionMatrix[3][2]) / (d + vec4(gl_ProjectionMatrix[2][2]));
|
return vec4(ProjectionMatrix[3][2]) / (d + vec4(ProjectionMatrix[2][2]));
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
|
||||||
// color buffer
|
// color buffer
|
||||||
uniform sampler2D colorbuffer;
|
uniform sampler2D colorbuffer;
|
||||||
|
|
||||||
@@ -9,8 +10,15 @@ uniform sampler1D ssao_concentric_tex;
|
|||||||
|
|
||||||
// depth buffer
|
// depth buffer
|
||||||
uniform sampler2D depthbuffer;
|
uniform sampler2D depthbuffer;
|
||||||
// coordinates on framebuffer in normalized (0.0-1.0) uv space
|
|
||||||
varying vec4 uvcoordsvar;
|
#if __VERSION__ == 120
|
||||||
|
// coordinates on framebuffer in normalized (0.0-1.0) uv space
|
||||||
|
varying vec4 uvcoordsvar;
|
||||||
|
#define FragColor gl_FragColor
|
||||||
|
#else
|
||||||
|
in vec4 uvcoordsvar;
|
||||||
|
out vec4 FragColor;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* ssao_params.x : pixel scale for the ssao radious */
|
/* ssao_params.x : pixel scale for the ssao radious */
|
||||||
/* ssao_params.y : factor for the ssao darkening */
|
/* ssao_params.y : factor for the ssao darkening */
|
||||||
@@ -46,9 +54,9 @@ float calculate_ssao_factor(float depth)
|
|||||||
/* find the offset in screen space by multiplying a point
|
/* find the offset in screen space by multiplying a point
|
||||||
* in camera space at the depth of the point by the projection matrix. */
|
* in camera space at the depth of the point by the projection matrix. */
|
||||||
vec2 offset;
|
vec2 offset;
|
||||||
float homcoord = gl_ProjectionMatrix[2][3] * position.z + gl_ProjectionMatrix[3][3];
|
float homcoord = ProjectionMatrix[2][3] * position.z + ProjectionMatrix[3][3];
|
||||||
offset.x = gl_ProjectionMatrix[0][0] * ssao_params.x / homcoord;
|
offset.x = ProjectionMatrix[0][0] * ssao_params.x / homcoord;
|
||||||
offset.y = gl_ProjectionMatrix[1][1] * ssao_params.x / homcoord;
|
offset.y = ProjectionMatrix[1][1] * ssao_params.x / homcoord;
|
||||||
/* convert from -1.0...1.0 range to 0.0..1.0 for easy use with texture coordinates */
|
/* convert from -1.0...1.0 range to 0.0..1.0 for easy use with texture coordinates */
|
||||||
offset *= 0.5;
|
offset *= 0.5;
|
||||||
|
|
||||||
@@ -90,5 +98,5 @@ void main()
|
|||||||
float depth = texture2D(depthbuffer, uvcoordsvar.xy).r;
|
float depth = texture2D(depthbuffer, uvcoordsvar.xy).r;
|
||||||
vec4 scene_col = texture2D(colorbuffer, uvcoordsvar.xy);
|
vec4 scene_col = texture2D(colorbuffer, uvcoordsvar.xy);
|
||||||
vec3 final_color = mix(scene_col.rgb, ssao_color.rgb, calculate_ssao_factor(depth));
|
vec3 final_color = mix(scene_col.rgb, ssao_color.rgb, calculate_ssao_factor(depth));
|
||||||
gl_FragColor = vec4(final_color.rgb, scene_col.a);
|
FragColor = vec4(final_color.rgb, scene_col.a);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,16 @@
|
|||||||
varying vec4 uvcoordsvar;
|
|
||||||
|
|
||||||
//very simple shader for full screen FX, just pass values on
|
#if __VERSION__ == 120
|
||||||
|
attribute vec2 pos;
|
||||||
|
attribute vec2 uvs;
|
||||||
|
varying vec4 uvcoordsvar;
|
||||||
|
#else
|
||||||
|
in vec2 pos;
|
||||||
|
in vec2 uvs;
|
||||||
|
out vec4 uvcoordsvar;
|
||||||
|
#endif
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
uvcoordsvar = gl_MultiTexCoord0;
|
uvcoordsvar = vec4(uvs, 0.0, 0.0);
|
||||||
gl_Position = gl_Vertex;
|
gl_Position = vec4(pos, 0.0, 1.0);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user