GPULamp: Move GPU_frambuffer_blur to GPU_lamp.c
This is a bit useless because gpu lamps are only used by the game engine and it is planned to be "remove" in some way. Doing this to clean gpu_framebuffer.c.
This commit is contained in:
@@ -69,9 +69,6 @@ void GPU_framebuffer_bind_no_save(GPUFrameBuffer *fb, int slot);
|
||||
bool GPU_framebuffer_bound(GPUFrameBuffer *fb);
|
||||
|
||||
void GPU_framebuffer_restore(void);
|
||||
void GPU_framebuffer_blur(
|
||||
GPUFrameBuffer *fb, struct GPUTexture *tex,
|
||||
GPUFrameBuffer *blurfb, struct GPUTexture *blurtex);
|
||||
|
||||
void GPU_framebuffer_blit(
|
||||
GPUFrameBuffer *fb_read, int read_slot,
|
||||
|
||||
@@ -439,85 +439,6 @@ void GPU_framebuffer_restore(void)
|
||||
}
|
||||
}
|
||||
|
||||
void GPU_framebuffer_blur(
|
||||
GPUFrameBuffer *fb, GPUTexture *tex,
|
||||
GPUFrameBuffer *blurfb, GPUTexture *blurtex)
|
||||
{
|
||||
const float fullscreencos[4][2] = {{-1.0f, -1.0f}, {1.0f, -1.0f}, {-1.0f, 1.0f}, {1.0f, 1.0f}};
|
||||
const float fullscreenuvs[4][2] = {{0.0f, 0.0f}, {1.0f, 0.0f}, {0.0f, 1.0f}, {1.0f, 1.0f}};
|
||||
|
||||
static Gwn_VertFormat format = {0};
|
||||
static Gwn_VertBuf vbo = {{0}};
|
||||
static Gwn_Batch batch = {{0}};
|
||||
|
||||
const float scaleh[2] = {1.0f / GPU_texture_width(blurtex), 0.0f};
|
||||
const float scalev[2] = {0.0f, 1.0f / GPU_texture_height(tex)};
|
||||
|
||||
GPUShader *blur_shader = GPU_shader_get_builtin_shader(GPU_SHADER_SEP_GAUSSIAN_BLUR);
|
||||
|
||||
if (!blur_shader)
|
||||
return;
|
||||
|
||||
/* Preparing to draw quad */
|
||||
if (format.attrib_ct == 0) {
|
||||
unsigned int i = 0;
|
||||
/* Vertex format */
|
||||
unsigned int pos = GWN_vertformat_attr_add(&format, "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT);
|
||||
unsigned int uvs = GWN_vertformat_attr_add(&format, "uvs", GWN_COMP_F32, 2, GWN_FETCH_FLOAT);
|
||||
|
||||
/* Vertices */
|
||||
GWN_vertbuf_init_with_format(&vbo, &format);
|
||||
GWN_vertbuf_data_alloc(&vbo, 36);
|
||||
|
||||
for (int j = 0; j < 3; ++j) {
|
||||
GWN_vertbuf_attr_set(&vbo, uvs, i, fullscreenuvs[j]);
|
||||
GWN_vertbuf_attr_set(&vbo, pos, i++, fullscreencos[j]);
|
||||
}
|
||||
for (int j = 1; j < 4; ++j) {
|
||||
GWN_vertbuf_attr_set(&vbo, uvs, i, fullscreenuvs[j]);
|
||||
GWN_vertbuf_attr_set(&vbo, pos, i++, fullscreencos[j]);
|
||||
}
|
||||
|
||||
GWN_batch_init(&batch, GL_TRIANGLES, &vbo, NULL);
|
||||
}
|
||||
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
|
||||
/* Blurring horizontally */
|
||||
/* We do the bind ourselves rather than using GPU_framebuffer_texture_bind() to avoid
|
||||
* pushing unnecessary matrices onto the OpenGL stack. */
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, blurfb->object);
|
||||
glDrawBuffer(GL_COLOR_ATTACHMENT0);
|
||||
|
||||
/* avoid warnings from texture binding */
|
||||
g_currentfb = blurfb->object;
|
||||
|
||||
glViewport(0, 0, GPU_texture_width(blurtex), GPU_texture_height(blurtex));
|
||||
|
||||
GPU_texture_bind(tex, 0);
|
||||
|
||||
GWN_batch_program_set_builtin(&batch, GPU_SHADER_SEP_GAUSSIAN_BLUR);
|
||||
GWN_batch_uniform_2f(&batch, "ScaleU", scaleh[0], scaleh[1]);
|
||||
GWN_batch_uniform_1i(&batch, "textureSource", GL_TEXTURE0);
|
||||
GWN_batch_draw(&batch);
|
||||
|
||||
/* Blurring vertically */
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, fb->object);
|
||||
glDrawBuffer(GL_COLOR_ATTACHMENT0);
|
||||
|
||||
g_currentfb = fb->object;
|
||||
|
||||
glViewport(0, 0, GPU_texture_width(tex), GPU_texture_height(tex));
|
||||
|
||||
GPU_texture_bind(blurtex, 0);
|
||||
|
||||
/* Hack to make the following uniform stick */
|
||||
GWN_batch_program_set_builtin(&batch, GPU_SHADER_SEP_GAUSSIAN_BLUR);
|
||||
GWN_batch_uniform_2f(&batch, "ScaleU", scalev[0], scalev[1]);
|
||||
GWN_batch_uniform_1i(&batch, "textureSource", GL_TEXTURE0);
|
||||
GWN_batch_draw(&batch);
|
||||
}
|
||||
|
||||
void GPU_framebuffer_blit(
|
||||
GPUFrameBuffer *fb_read, int read_slot, GPUFrameBuffer *fb_write,
|
||||
int write_slot, bool use_depth, bool use_stencil)
|
||||
|
||||
@@ -49,6 +49,7 @@
|
||||
#include "GPU_material.h"
|
||||
#include "GPU_shader.h"
|
||||
#include "GPU_texture.h"
|
||||
#include "GPU_batch.h"
|
||||
|
||||
#include "gpu_lamp_private.h"
|
||||
|
||||
@@ -333,7 +334,6 @@ GPULamp *GPU_lamp_from_blender(Scene *scene, Object *ob, Object *par)
|
||||
return lamp;
|
||||
}
|
||||
|
||||
GPU_framebuffer_texture_unbind(lamp->blurfb, lamp->blurtex);
|
||||
}
|
||||
else {
|
||||
lamp->tex = GPU_texture_create_depth(lamp->size, lamp->size, NULL);
|
||||
@@ -447,11 +447,43 @@ void GPU_lamp_shadow_buffer_bind(GPULamp *lamp, float viewmat[4][4], int *winsiz
|
||||
*winsize = lamp->size;
|
||||
}
|
||||
|
||||
static void gpu_lamp_shadow_blur(GPULamp *lamp)
|
||||
{
|
||||
const float scaleh[2] = {1.0f / GPU_texture_width(lamp->blurtex), 0.0f};
|
||||
const float scalev[2] = {0.0f, 1.0f / GPU_texture_height(lamp->tex)};
|
||||
|
||||
GPUShader *blur_shader = GPU_shader_get_builtin_shader(GPU_SHADER_SEP_GAUSSIAN_BLUR);
|
||||
|
||||
if (!blur_shader)
|
||||
return;
|
||||
|
||||
int tex_loc = GPU_shader_get_uniform(blur_shader, "textureSource");
|
||||
int scale_loc = GPU_shader_get_uniform(blur_shader, "ScaleU");
|
||||
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
|
||||
GPU_shader_bind(blur_shader);
|
||||
|
||||
/* Blurring horizontally */
|
||||
GPU_framebuffer_bind(lamp->blurfb);
|
||||
GPU_texture_bind(lamp->tex, 0);
|
||||
GPU_shader_uniform_vector(blur_shader, scale_loc, 2, 1, scaleh);
|
||||
GPU_shader_uniform_texture(blur_shader, tex_loc, lamp->tex);
|
||||
GWN_draw_primitive(GL_TRIANGLES, 3);
|
||||
|
||||
/* Blurring vertically */
|
||||
GPU_framebuffer_bind(lamp->fb);
|
||||
GPU_texture_bind(lamp->blurtex, 0);
|
||||
GPU_shader_uniform_vector(blur_shader, scale_loc, 2, 1, scalev);
|
||||
GPU_shader_uniform_texture(blur_shader, tex_loc, lamp->blurtex);
|
||||
GWN_draw_primitive(GL_TRIANGLES, 3);
|
||||
}
|
||||
|
||||
void GPU_lamp_shadow_buffer_unbind(GPULamp *lamp)
|
||||
{
|
||||
if (lamp->la->shadowmap_type == LA_SHADMAP_VARIANCE) {
|
||||
GPU_shader_unbind();
|
||||
GPU_framebuffer_blur(lamp->fb, lamp->tex, lamp->blurfb, lamp->blurtex);
|
||||
gpu_lamp_shadow_blur(lamp);
|
||||
}
|
||||
|
||||
GPU_framebuffer_texture_unbind(lamp->fb, lamp->tex);
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
|
||||
uniform mat4 ModelViewProjectionMatrix;
|
||||
|
||||
in vec2 pos;
|
||||
in vec2 uvs;
|
||||
out vec2 texCoord_interp;
|
||||
|
||||
void main()
|
||||
{
|
||||
gl_Position = ModelViewProjectionMatrix * vec4(pos, 0.0, 1.0);
|
||||
texCoord_interp = uvs;
|
||||
const vec4 vert[3] = vec4[3](
|
||||
vec3(-1.0, -1.0, 0.0, 0.0),
|
||||
vec3( 3.0, -1.0, 2.0, 0.0),
|
||||
vec3(-1.0, 3.0, 0.0, 2.0)
|
||||
);
|
||||
|
||||
gl_Position = vec4(vert[gl_VertexID].xy, 0.0, 1.0);
|
||||
texCoord_interp = vert[gl_VertexID].zw;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user