Fix high quality depth of field on the Mac.
Quite a few things wrong here: * Mac did not support EXT_draw_instanced, only ARB_draw_instanced * Draw instanced did not work unless data came from vertex buffer, which is second time we see weird things with vertex arrays in mac * There were a few stupid mistakes by me as well, such as binding to uniform locations for the wrong shaders (it's a wonder it ever worked :p)
This commit is contained in:
@@ -184,7 +184,7 @@ int GPU_offscreen_height(const GPUOffScreen *ofs);
|
||||
* - only for fragment shaders now
|
||||
* - must call texture bind before setting a texture as uniform! */
|
||||
|
||||
GPUShader *GPU_shader_create(const char *vertexcode, const char *fragcode, const char *geocode, const char *libcode, const char *defines);
|
||||
GPUShader *GPU_shader_create(const char *vertexcode, const char *fragcode, const char *geocode, const char *libcode, const char *defines, int input, int output, int number);
|
||||
void GPU_shader_free(GPUShader *shader);
|
||||
|
||||
void GPU_shader_bind(GPUShader *shader);
|
||||
|
||||
@@ -1419,7 +1419,7 @@ GPUPass *GPU_generate_pass(ListBase *nodes, GPUNodeLink *outlink,
|
||||
/* generate code and compile with opengl */
|
||||
fragmentcode = code_generate_fragment(nodes, outlink->output);
|
||||
vertexcode = code_generate_vertex(nodes, type);
|
||||
shader = GPU_shader_create(vertexcode, fragmentcode, NULL, glsl_material_library, NULL);
|
||||
shader = GPU_shader_create(vertexcode, fragmentcode, NULL, glsl_material_library, NULL, 0, 0, 0);
|
||||
|
||||
/* failed? */
|
||||
if (!shader) {
|
||||
|
||||
@@ -114,6 +114,8 @@ struct GPUFX {
|
||||
|
||||
/* we have a stencil, restore the previous state */
|
||||
bool restore_stencil;
|
||||
|
||||
unsigned int vbuffer;
|
||||
};
|
||||
|
||||
#if 0
|
||||
@@ -177,6 +179,12 @@ GPUFX *GPU_fx_compositor_create(void)
|
||||
{
|
||||
GPUFX *fx = MEM_callocN(sizeof(GPUFX), "GPUFX compositor");
|
||||
|
||||
glGenBuffersARB(1, &fx->vbuffer);
|
||||
glBindBufferARB(GL_ARRAY_BUFFER_ARB, fx->vbuffer);
|
||||
glBufferDataARB(GL_ARRAY_BUFFER_ARB, 16 * sizeof(float), NULL, GL_STATIC_DRAW);
|
||||
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, 8 * sizeof(float), fullscreencos);
|
||||
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 8 * sizeof(float), 8 * sizeof(float), fullscreenuvs);
|
||||
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
|
||||
return fx;
|
||||
}
|
||||
|
||||
@@ -583,8 +591,9 @@ void GPU_fx_compositor_XRay_resolve(GPUFX *fx)
|
||||
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
|
||||
|
||||
/* set up quad buffer */
|
||||
glVertexPointer(2, GL_FLOAT, 0, fullscreencos);
|
||||
glTexCoordPointer(2, GL_FLOAT, 0, fullscreenuvs);
|
||||
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 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);
|
||||
|
||||
@@ -613,6 +622,7 @@ void GPU_fx_compositor_XRay_resolve(GPUFX *fx)
|
||||
|
||||
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
||||
|
||||
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
|
||||
glDisableClientState(GL_VERTEX_ARRAY);
|
||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
|
||||
@@ -649,8 +659,9 @@ bool GPU_fx_do_composite_pass(GPUFX *fx, float projmat[4][4], bool is_persp, str
|
||||
target = fx->color_buffer_sec;
|
||||
|
||||
/* set up quad buffer */
|
||||
glVertexPointer(2, GL_FLOAT, 0, fullscreencos);
|
||||
glTexCoordPointer(2, GL_FLOAT, 0, fullscreenuvs);
|
||||
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 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);
|
||||
|
||||
@@ -793,6 +804,7 @@ bool GPU_fx_do_composite_pass(GPUFX *fx, float projmat[4][4], bool is_persp, str
|
||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
|
||||
GPU_shader_unbind();
|
||||
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -862,7 +874,7 @@ bool GPU_fx_do_composite_pass(GPUFX *fx, float projmat[4][4], bool is_persp, str
|
||||
color_uniform = GPU_shader_get_uniform(dof_shader_pass2, "colorbuffer");
|
||||
coc_uniform = GPU_shader_get_uniform(dof_shader_pass2, "cocbuffer");
|
||||
select_uniform = GPU_shader_get_uniform(dof_shader_pass2, "layerselection");
|
||||
dof_uniform = GPU_shader_get_uniform(dof_shader_pass1, "dof_params");
|
||||
dof_uniform = GPU_shader_get_uniform(dof_shader_pass2, "dof_params");
|
||||
|
||||
GPU_shader_bind(dof_shader_pass2);
|
||||
|
||||
@@ -882,13 +894,14 @@ bool GPU_fx_do_composite_pass(GPUFX *fx, float projmat[4][4], bool is_persp, str
|
||||
GPU_framebuffer_texture_attach(fx->gbuffer, fx->dof_far_blur, 0, NULL);
|
||||
GPU_texture_bind_as_framebuffer(fx->dof_far_blur);
|
||||
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
glEnable(GL_BLEND);
|
||||
glBlendFunc(GL_ONE, GL_ONE);
|
||||
/* have to clear the buffer unfortunately */
|
||||
glClearColor(0.0, 0.0, 0.0, 0.0);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
/* the draw call we all waited for, draw a point per pixel, scaled per circle of confusion */
|
||||
glDrawArraysInstancedEXT(GL_POINTS, 0, 1, fx->dof_downsampled_w * fx->dof_downsampled_h);
|
||||
glDrawArraysInstancedARB(GL_POINTS, 0, 1, fx->dof_downsampled_w * fx->dof_downsampled_h);
|
||||
|
||||
GPU_texture_unbind(fx->dof_half_downsampled_far);
|
||||
GPU_framebuffer_texture_detach(fx->dof_far_blur);
|
||||
@@ -905,7 +918,7 @@ bool GPU_fx_do_composite_pass(GPUFX *fx, float projmat[4][4], bool is_persp, str
|
||||
/* have to clear the buffer unfortunately */
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
/* the draw call we all waited for, draw a point per pixel, scaled per circle of confusion */
|
||||
glDrawArraysInstancedEXT(GL_POINTS, 0, 1, fx->dof_downsampled_w * fx->dof_downsampled_h);
|
||||
glDrawArraysInstancedARB(GL_POINTS, 0, 1, fx->dof_downsampled_w * fx->dof_downsampled_h);
|
||||
|
||||
/* disable bindings */
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
@@ -931,8 +944,8 @@ bool GPU_fx_do_composite_pass(GPUFX *fx, float projmat[4][4], bool is_persp, str
|
||||
color_uniform = GPU_shader_get_uniform(dof_shader_pass3, "colorbuffer");
|
||||
far_uniform = GPU_shader_get_uniform(dof_shader_pass3, "farbuffer");
|
||||
near_uniform = GPU_shader_get_uniform(dof_shader_pass3, "nearbuffer");
|
||||
viewvecs_uniform = GPU_shader_get_uniform(dof_shader_pass1, "viewvecs");
|
||||
depth_uniform = GPU_shader_get_uniform(dof_shader_pass1, "depthbuffer");
|
||||
viewvecs_uniform = GPU_shader_get_uniform(dof_shader_pass3, "viewvecs");
|
||||
depth_uniform = GPU_shader_get_uniform(dof_shader_pass3, "depthbuffer");
|
||||
|
||||
GPU_shader_bind(dof_shader_pass3);
|
||||
|
||||
@@ -951,7 +964,7 @@ bool GPU_fx_do_composite_pass(GPUFX *fx, float projmat[4][4], bool is_persp, str
|
||||
|
||||
GPU_texture_bind(fx->depth_buffer, numslots++);
|
||||
GPU_texture_filter_mode(fx->depth_buffer, false, false);
|
||||
GPU_shader_uniform_texture(dof_shader_pass1, depth_uniform, fx->depth_buffer);
|
||||
GPU_shader_uniform_texture(dof_shader_pass3, depth_uniform, fx->depth_buffer);
|
||||
|
||||
GPU_texture_bind(src, numslots++);
|
||||
GPU_shader_uniform_texture(dof_shader_pass3, color_uniform, src);
|
||||
@@ -1002,6 +1015,7 @@ bool GPU_fx_do_composite_pass(GPUFX *fx, float projmat[4][4], bool is_persp, str
|
||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
|
||||
GPU_shader_unbind();
|
||||
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1230,6 +1244,7 @@ bool GPU_fx_do_composite_pass(GPUFX *fx, float projmat[4][4], bool is_persp, str
|
||||
|
||||
glDisableClientState(GL_VERTEX_ARRAY);
|
||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
|
||||
|
||||
GPU_shader_unbind();
|
||||
|
||||
|
||||
@@ -289,7 +289,7 @@ bool GPU_geometry_shader_support(void)
|
||||
|
||||
bool GPU_instanced_drawing_support(void)
|
||||
{
|
||||
return GLEW_EXT_draw_instanced;
|
||||
return GLEW_ARB_draw_instanced;
|
||||
}
|
||||
|
||||
int GPU_color_depth(void)
|
||||
@@ -1456,7 +1456,7 @@ static void gpu_shader_standard_extensions(char defines[MAX_EXT_DEFINE_LENGTH])
|
||||
|
||||
if (GPU_instanced_drawing_support()) {
|
||||
strcat(defines, "#extension GL_EXT_gpu_shader4: enable\n");
|
||||
strcat(defines, "#extension GL_EXT_draw_instanced: enable\n");
|
||||
strcat(defines, "#extension GL_ARB_draw_instanced: enable\n");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1478,7 +1478,7 @@ static void gpu_shader_standard_defines(char defines[MAX_DEFINE_LENGTH])
|
||||
return;
|
||||
}
|
||||
|
||||
GPUShader *GPU_shader_create(const char *vertexcode, const char *fragcode, const char *geocode, const char *libcode, const char *defines)
|
||||
GPUShader *GPU_shader_create(const char *vertexcode, const char *fragcode, const char *geocode, const char *libcode, const char *defines, int input, int output, int number)
|
||||
{
|
||||
GLint status;
|
||||
GLcharARB log[5000];
|
||||
@@ -1577,7 +1577,6 @@ GPUShader *GPU_shader_create(const char *vertexcode, const char *fragcode, const
|
||||
source[num_source++] = standard_defines;
|
||||
|
||||
if (defines) source[num_source++] = defines;
|
||||
if (libcode) source[num_source++] = libcode;
|
||||
source[num_source++] = geocode;
|
||||
|
||||
glAttachObjectARB(shader->object, shader->geometry);
|
||||
@@ -1593,6 +1592,8 @@ GPUShader *GPU_shader_create(const char *vertexcode, const char *fragcode, const
|
||||
GPU_shader_free(shader);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
GPU_shader_geometry_stage_primitive_io(shader, input, output, number);
|
||||
}
|
||||
|
||||
|
||||
@@ -1732,9 +1733,6 @@ void GPU_shader_geometry_stage_primitive_io(GPUShader *shader, int input, int ou
|
||||
glProgramParameteriEXT(shader->object, GL_GEOMETRY_INPUT_TYPE_EXT, input);
|
||||
glProgramParameteriEXT(shader->object, GL_GEOMETRY_OUTPUT_TYPE_EXT, output);
|
||||
glProgramParameteriEXT(shader->object, GL_GEOMETRY_VERTICES_OUT_EXT, number);
|
||||
|
||||
/* relink so settings can take effect (sucks but should only be done right after compilation so...) */
|
||||
glLinkProgramARB(shader->object);
|
||||
}
|
||||
|
||||
void GPU_shader_uniform_texture(GPUShader *UNUSED(shader), int location, GPUTexture *tex)
|
||||
@@ -1784,12 +1782,12 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader)
|
||||
switch (shader) {
|
||||
case GPU_SHADER_VSM_STORE:
|
||||
if (!GG.shaders.vsm_store)
|
||||
GG.shaders.vsm_store = GPU_shader_create(datatoc_gpu_shader_vsm_store_vert_glsl, datatoc_gpu_shader_vsm_store_frag_glsl, NULL, NULL, NULL);
|
||||
GG.shaders.vsm_store = GPU_shader_create(datatoc_gpu_shader_vsm_store_vert_glsl, datatoc_gpu_shader_vsm_store_frag_glsl, NULL, NULL, NULL, 0, 0, 0);
|
||||
retval = GG.shaders.vsm_store;
|
||||
break;
|
||||
case GPU_SHADER_SEP_GAUSSIAN_BLUR:
|
||||
if (!GG.shaders.sep_gaussian_blur)
|
||||
GG.shaders.sep_gaussian_blur = GPU_shader_create(datatoc_gpu_shader_sep_gaussian_blur_vert_glsl, datatoc_gpu_shader_sep_gaussian_blur_frag_glsl, NULL, NULL, NULL);
|
||||
GG.shaders.sep_gaussian_blur = GPU_shader_create(datatoc_gpu_shader_sep_gaussian_blur_vert_glsl, datatoc_gpu_shader_sep_gaussian_blur_frag_glsl, NULL, NULL, NULL, 0, 0, 0);
|
||||
retval = GG.shaders.sep_gaussian_blur;
|
||||
break;
|
||||
}
|
||||
@@ -1822,56 +1820,53 @@ GPUShader *GPU_shader_get_builtin_fx_shader(int effects, bool persp)
|
||||
|
||||
switch(effects) {
|
||||
case GPU_SHADER_FX_SSAO:
|
||||
GG.shaders.fx_shaders[offset] = GPU_shader_create(datatoc_gpu_shader_fx_vert_glsl, datatoc_gpu_shader_fx_ssao_frag_glsl, NULL, datatoc_gpu_shader_fx_lib_glsl, defines);
|
||||
GG.shaders.fx_shaders[offset] = GPU_shader_create(datatoc_gpu_shader_fx_vert_glsl, datatoc_gpu_shader_fx_ssao_frag_glsl, NULL, datatoc_gpu_shader_fx_lib_glsl, defines, 0, 0, 0);
|
||||
break;
|
||||
|
||||
case GPU_SHADER_FX_DEPTH_OF_FIELD_PASS_ONE:
|
||||
strcat(defines, "#define FIRST_PASS\n");
|
||||
GG.shaders.fx_shaders[offset] = GPU_shader_create(datatoc_gpu_shader_fx_dof_vert_glsl, datatoc_gpu_shader_fx_dof_frag_glsl, NULL, datatoc_gpu_shader_fx_lib_glsl, defines);
|
||||
GG.shaders.fx_shaders[offset] = GPU_shader_create(datatoc_gpu_shader_fx_dof_vert_glsl, datatoc_gpu_shader_fx_dof_frag_glsl, NULL, datatoc_gpu_shader_fx_lib_glsl, defines, 0, 0, 0);
|
||||
break;
|
||||
|
||||
case GPU_SHADER_FX_DEPTH_OF_FIELD_PASS_TWO:
|
||||
strcat(defines, "#define SECOND_PASS\n");
|
||||
GG.shaders.fx_shaders[offset] = GPU_shader_create(datatoc_gpu_shader_fx_dof_vert_glsl, datatoc_gpu_shader_fx_dof_frag_glsl, NULL, datatoc_gpu_shader_fx_lib_glsl, defines);
|
||||
GG.shaders.fx_shaders[offset] = GPU_shader_create(datatoc_gpu_shader_fx_dof_vert_glsl, datatoc_gpu_shader_fx_dof_frag_glsl, NULL, datatoc_gpu_shader_fx_lib_glsl, defines, 0, 0, 0);
|
||||
break;
|
||||
|
||||
case GPU_SHADER_FX_DEPTH_OF_FIELD_PASS_THREE:
|
||||
strcat(defines, "#define THIRD_PASS\n");
|
||||
GG.shaders.fx_shaders[offset] = GPU_shader_create(datatoc_gpu_shader_fx_dof_vert_glsl, datatoc_gpu_shader_fx_dof_frag_glsl, NULL, datatoc_gpu_shader_fx_lib_glsl, defines);
|
||||
GG.shaders.fx_shaders[offset] = GPU_shader_create(datatoc_gpu_shader_fx_dof_vert_glsl, datatoc_gpu_shader_fx_dof_frag_glsl, NULL, datatoc_gpu_shader_fx_lib_glsl, defines, 0, 0, 0);
|
||||
break;
|
||||
|
||||
case GPU_SHADER_FX_DEPTH_OF_FIELD_PASS_FOUR:
|
||||
strcat(defines, "#define FOURTH_PASS\n");
|
||||
GG.shaders.fx_shaders[offset] = GPU_shader_create(datatoc_gpu_shader_fx_dof_vert_glsl, datatoc_gpu_shader_fx_dof_frag_glsl, NULL, datatoc_gpu_shader_fx_lib_glsl, defines);
|
||||
GG.shaders.fx_shaders[offset] = GPU_shader_create(datatoc_gpu_shader_fx_dof_vert_glsl, datatoc_gpu_shader_fx_dof_frag_glsl, NULL, datatoc_gpu_shader_fx_lib_glsl, defines, 0, 0, 0);
|
||||
break;
|
||||
|
||||
case GPU_SHADER_FX_DEPTH_OF_FIELD_PASS_FIVE:
|
||||
strcat(defines, "#define FIFTH_PASS\n");
|
||||
GG.shaders.fx_shaders[offset] = GPU_shader_create(datatoc_gpu_shader_fx_dof_vert_glsl, datatoc_gpu_shader_fx_dof_frag_glsl, NULL, datatoc_gpu_shader_fx_lib_glsl, defines);
|
||||
GG.shaders.fx_shaders[offset] = GPU_shader_create(datatoc_gpu_shader_fx_dof_vert_glsl, datatoc_gpu_shader_fx_dof_frag_glsl, NULL, datatoc_gpu_shader_fx_lib_glsl, defines, 0, 0, 0);
|
||||
break;
|
||||
|
||||
case GPU_SHADER_FX_DEPTH_OF_FIELD_HQ_PASS_ONE:
|
||||
strcat(defines, "#define FIRST_PASS\n");
|
||||
GG.shaders.fx_shaders[offset] = GPU_shader_create(datatoc_gpu_shader_fx_dof_hq_vert_glsl, datatoc_gpu_shader_fx_dof_hq_frag_glsl, NULL, datatoc_gpu_shader_fx_lib_glsl, defines);
|
||||
GG.shaders.fx_shaders[offset] = GPU_shader_create(datatoc_gpu_shader_fx_dof_hq_vert_glsl, datatoc_gpu_shader_fx_dof_hq_frag_glsl, NULL, datatoc_gpu_shader_fx_lib_glsl, defines, 0, 0, 0);
|
||||
break;
|
||||
|
||||
case GPU_SHADER_FX_DEPTH_OF_FIELD_HQ_PASS_TWO:
|
||||
strcat(defines, "#define SECOND_PASS\n");
|
||||
shader = GPU_shader_create(datatoc_gpu_shader_fx_dof_hq_vert_glsl, datatoc_gpu_shader_fx_dof_hq_frag_glsl, datatoc_gpu_shader_fx_dof_hq_geo_glsl, datatoc_gpu_shader_fx_lib_glsl, defines);
|
||||
|
||||
if (shader) {
|
||||
GG.shaders.fx_shaders[offset] = shader;
|
||||
GPU_shader_geometry_stage_primitive_io(shader, GL_POINTS, GL_TRIANGLE_STRIP, 4);
|
||||
}
|
||||
shader = GPU_shader_create(datatoc_gpu_shader_fx_dof_hq_vert_glsl, datatoc_gpu_shader_fx_dof_hq_frag_glsl, datatoc_gpu_shader_fx_dof_hq_geo_glsl, datatoc_gpu_shader_fx_lib_glsl,
|
||||
defines, GL_POINTS, GL_TRIANGLE_STRIP, 4);
|
||||
GG.shaders.fx_shaders[offset] = shader;
|
||||
break;
|
||||
|
||||
case GPU_SHADER_FX_DEPTH_OF_FIELD_HQ_PASS_THREE:
|
||||
strcat(defines, "#define THIRD_PASS\n");
|
||||
GG.shaders.fx_shaders[offset] = GPU_shader_create(datatoc_gpu_shader_fx_dof_hq_vert_glsl, datatoc_gpu_shader_fx_dof_hq_frag_glsl, NULL, datatoc_gpu_shader_fx_lib_glsl, defines);
|
||||
GG.shaders.fx_shaders[offset] = GPU_shader_create(datatoc_gpu_shader_fx_dof_hq_vert_glsl, datatoc_gpu_shader_fx_dof_hq_frag_glsl, NULL, datatoc_gpu_shader_fx_lib_glsl, defines, 0, 0, 0);
|
||||
break;
|
||||
|
||||
case GPU_SHADER_FX_DEPTH_RESOLVE:
|
||||
GG.shaders.fx_shaders[offset] = GPU_shader_create(datatoc_gpu_shader_fx_vert_glsl, datatoc_gpu_shader_fx_depth_resolve_glsl, NULL, NULL, defines);
|
||||
GG.shaders.fx_shaders[offset] = GPU_shader_create(datatoc_gpu_shader_fx_vert_glsl, datatoc_gpu_shader_fx_depth_resolve_glsl, NULL, NULL, defines, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -152,7 +152,7 @@ static GPUShader *gpu_simple_shader(int options)
|
||||
datatoc_gpu_shader_simple_vert_glsl,
|
||||
datatoc_gpu_shader_simple_frag_glsl,
|
||||
NULL,
|
||||
NULL, defines);
|
||||
NULL, defines, 0, 0, 0);
|
||||
|
||||
if (shader) {
|
||||
/* set texture map to first texture unit */
|
||||
|
||||
@@ -102,7 +102,7 @@ void accumulate_pass(void) {
|
||||
if (dof_params.w == 0.0)
|
||||
r = 1.0;
|
||||
else
|
||||
r = cos(M_PI / dof_params.w) / (cos(theta - (2.0 * M_PI / dof_params.w) * floor((dof_params.w * theta + M_PI) / (2 * M_PI))));
|
||||
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))));
|
||||
|
||||
if (dot(particlecoord, particlecoord) > r * r)
|
||||
discard;
|
||||
@@ -124,7 +124,7 @@ void final_pass(void) {
|
||||
|
||||
vec4 farcolor = texture2D(farbuffer, uvcoord);
|
||||
float farweight = farcolor.a;
|
||||
if (farweight > 0)
|
||||
if (farweight > 0.0)
|
||||
farcolor /= farweight;
|
||||
vec4 nearcolor = texture2D(nearbuffer, uvcoord);
|
||||
|
||||
@@ -138,7 +138,7 @@ void final_pass(void) {
|
||||
farweight = mix(1.0, farweight, mixfac);
|
||||
|
||||
float nearweight = nearcolor.a;
|
||||
if (nearweight > 0) {
|
||||
if (nearweight > 0.0) {
|
||||
nearcolor /= nearweight;
|
||||
}
|
||||
|
||||
|
||||
@@ -27,11 +27,11 @@ void vert_dof_downsample()
|
||||
/* geometry shading pass, calculate a texture coordinate based on the indexed id */
|
||||
void vert_dof_coc_scatter_pass()
|
||||
{
|
||||
vec2 pixel = vec2(1.0 / float(rendertargetdim.x), 1.0 / float(rendertargetdim.y));
|
||||
vec2 pixel = vec2(rendertargetdim.x, rendertargetdim.y);
|
||||
/* some math to get the target pixel */
|
||||
int row = gl_InstanceID / rendertargetdim.x;
|
||||
int column = gl_InstanceID % rendertargetdim.x;
|
||||
uvcoord = vec2(column, row) * pixel + 0.5 * pixel;
|
||||
uvcoord = (vec2(column, row) + vec2(0.5)) / pixel;
|
||||
|
||||
vec2 pos = uvcoord * 2.0 - vec2(1.0);
|
||||
gl_Position = vec4(pos.x, pos.y, 0.0, 1.0);
|
||||
|
||||
Reference in New Issue
Block a user