Browse Source

neercs: refactor the shader system.

master
Sam Hocevar 10 years ago
parent
commit
9bfaa46d54
13 changed files with 206 additions and 161 deletions
  1. +3
    -2
      neercs/video/blurh.lolfx
  2. +3
    -2
      neercs/video/blurv.lolfx
  3. +3
    -1
      neercs/video/color.lolfx
  4. +3
    -2
      neercs/video/copper.lolfx
  5. +3
    -2
      neercs/video/glow.lolfx
  6. +3
    -2
      neercs/video/mirror.lolfx
  7. +3
    -1
      neercs/video/noise.lolfx
  8. +3
    -1
      neercs/video/postfx.lolfx
  9. +3
    -2
      neercs/video/radial.lolfx
  10. +3
    -2
      neercs/video/remanence.lolfx
  11. +157
    -131
      neercs/video/render.cpp
  12. +16
    -11
      neercs/video/render.h
  13. +3
    -2
      neercs/video/simple.lolfx

+ 3
- 2
neercs/video/blurh.lolfx View File

@@ -2,12 +2,13 @@


#version 120 #version 120


attribute vec4 in_Position;
varying vec2 pass_TexCoord; varying vec2 pass_TexCoord;


void main() void main()
{ {
gl_Position = gl_Vertex;
pass_TexCoord = vec2(0.5, 0.5) + 0.5 * gl_Vertex.xy;
gl_Position = in_Position;
pass_TexCoord = vec2(0.5, 0.5) + 0.5 * in_Position.xy;
} }


[frag.glsl] [frag.glsl]


+ 3
- 2
neercs/video/blurv.lolfx View File

@@ -2,12 +2,13 @@


#version 120 #version 120


attribute vec4 in_Position;
varying vec2 pass_TexCoord; varying vec2 pass_TexCoord;


void main() void main()
{ {
gl_Position = gl_Vertex;
pass_TexCoord = vec2(0.5, 0.5) + 0.5 * gl_Vertex.xy;
gl_Position = in_Position;
pass_TexCoord = vec2(0.5, 0.5) + 0.5 * in_Position.xy;
} }


[frag.glsl] [frag.glsl]


+ 3
- 1
neercs/video/color.lolfx View File

@@ -2,9 +2,11 @@


#version 120 #version 120


attribute vec4 in_Position;

void main() void main()
{ {
gl_Position = gl_Vertex;
gl_Position = in_Position;
} }


[frag.glsl] [frag.glsl]


+ 3
- 2
neercs/video/copper.lolfx View File

@@ -2,12 +2,13 @@


#version 120 #version 120


attribute vec4 in_Position;
varying vec2 pass_TexCoord; varying vec2 pass_TexCoord;


void main() void main()
{ {
gl_Position = gl_Vertex;
pass_TexCoord = vec2(0.5, 0.5) + 0.5 * gl_Vertex.xy;
gl_Position = in_Position;
pass_TexCoord = vec2(0.5, 0.5) + 0.5 * in_Position.xy;
} }


[frag.glsl] [frag.glsl]


+ 3
- 2
neercs/video/glow.lolfx View File

@@ -2,12 +2,13 @@


#version 120 #version 120


attribute vec4 in_Position;
varying vec2 pass_TexCoord; varying vec2 pass_TexCoord;


void main() void main()
{ {
gl_Position = gl_Vertex;
pass_TexCoord = vec2(0.5, 0.5) + 0.5 * gl_Vertex.xy;
gl_Position = in_Position;
pass_TexCoord = vec2(0.5, 0.5) + 0.5 * in_Position.xy;
} }


[frag.glsl] [frag.glsl]


+ 3
- 2
neercs/video/mirror.lolfx View File

@@ -2,12 +2,13 @@


#version 120 #version 120


attribute vec4 in_Position;
varying vec2 pass_TexCoord; varying vec2 pass_TexCoord;


void main() void main()
{ {
gl_Position = gl_Vertex;
pass_TexCoord = vec2(0.5, 0.5) + 0.5 * gl_Vertex.xy;
gl_Position = in_Position;
pass_TexCoord = vec2(0.5, 0.5) + 0.5 * in_Position.xy;
} }


[frag.glsl] [frag.glsl]


+ 3
- 1
neercs/video/noise.lolfx View File

@@ -2,9 +2,11 @@


#version 120 #version 120


attribute vec4 in_Position;

void main() void main()
{ {
gl_Position = gl_Vertex;
gl_Position = in_Position;
} }


[frag.glsl] [frag.glsl]


+ 3
- 1
neercs/video/postfx.lolfx View File

@@ -2,9 +2,11 @@


#version 120 #version 120


attribute vec4 in_Position;

void main() void main()
{ {
gl_Position = gl_Vertex;
gl_Position = in_Position;
} }


[frag.glsl] [frag.glsl]


+ 3
- 2
neercs/video/radial.lolfx View File

@@ -2,12 +2,13 @@


#version 120 #version 120


attribute vec4 in_Position;
varying vec2 pass_TexCoord; varying vec2 pass_TexCoord;


void main() void main()
{ {
gl_Position = gl_Vertex;
pass_TexCoord = vec2(0.5, 0.5) + 0.5 * gl_Vertex.xy;
gl_Position = in_Position;
pass_TexCoord = vec2(0.5, 0.5) + 0.5 * in_Position.xy;
} }


[frag.glsl] [frag.glsl]


+ 3
- 2
neercs/video/remanence.lolfx View File

@@ -2,12 +2,13 @@


#version 120 #version 120


attribute vec4 in_Position;
varying vec2 pass_TexCoord; varying vec2 pass_TexCoord;


void main() void main()
{ {
gl_Position = gl_Vertex;
pass_TexCoord = vec2(0.5, 0.5) + 0.5 * gl_Vertex.xy;
gl_Position = in_Position;
pass_TexCoord = vec2(0.5, 0.5) + 0.5 * in_Position.xy;
} }


[frag.glsl] [frag.glsl]


+ 157
- 131
neercs/video/render.cpp View File

@@ -841,34 +841,46 @@ ShaderUniform shader_radial_texture,
shader_radial_screen_size, shader_radial_screen_size,
shader_radial_radial; shader_radial_radial;


Framebuffer *fbo_back, *fbo_front, *fbo_screen;
Framebuffer *fbo_blur_h, *fbo_blur_v;
Framebuffer *fbo_tmp, *fbo_buffer;

void Render::TraceQuad() void Render::TraceQuad()
{ {
glLoadIdentity();
glDrawArrays(GL_QUADS, 0, 4);
m_vdecl->Bind();
m_vdecl->DrawElements(MeshPrimitive::Triangles, 0, 6);
m_vdecl->Unbind();
} }


void Render::ShaderSimple(Framebuffer *fbo_output, int n) void Render::ShaderSimple(Framebuffer *fbo_output, int n)
{ {
shader_simple->Bind(); shader_simple->Bind();
shader_simple->SetUniform(shader_simple_texture, fbo_output->GetTextureUniform(), n); shader_simple->SetUniform(shader_simple_texture, fbo_output->GetTextureUniform(), n);
m_vdecl->SetStream(m_vbo, shader_simple->GetAttribLocation(VertexUsage::Position, 0));
TraceQuad(); TraceQuad();
shader_simple->Unbind(); shader_simple->Unbind();
} }


int Render::InitDrawResources(void) int Render::InitDrawResources(void)
{ {
/* initialise framebuffer objects */
fbo_back = new Framebuffer(screen_size);
fbo_screen = new Framebuffer(screen_size);
fbo_front = new Framebuffer(screen_size);
fbo_buffer = new Framebuffer(screen_size);
fbo_blur_h = new Framebuffer(screen_size);
fbo_blur_v = new Framebuffer(screen_size);
fbo_tmp = new Framebuffer(screen_size);
/* Initialise framebuffer objects */
m_fbos.back = new Framebuffer(screen_size);
m_fbos.screen = new Framebuffer(screen_size);
m_fbos.front = new Framebuffer(screen_size);
m_fbos.buffer = new Framebuffer(screen_size);
m_fbos.blur_h = new Framebuffer(screen_size);
m_fbos.blur_v = new Framebuffer(screen_size);
m_fbos.tmp = new Framebuffer(screen_size);

/* Initialise vertex declaration */
m_vdecl = new VertexDeclaration(VertexStream<vec2>(VertexUsage::Position));
Array<vec2> vertices;
vertices << vec2(-1, 1);
vertices << vec2(-1, -1);
vertices << vec2(1, -1);
vertices << vec2(1, -1);
vertices << vec2(1, 1);
vertices << vec2(-1, 1);
m_vbo = new VertexBuffer(vertices.Bytes());
memcpy(m_vbo->Lock(0, 0), vertices.Data(), vertices.Bytes());
m_vbo->Unlock();

// shader simple // shader simple
shader_simple = Shader::Create(LOLFX_RESOURCE_NAME(simple)); shader_simple = Shader::Create(LOLFX_RESOURCE_NAME(simple));
shader_simple_texture = shader_simple->GetUniformLocation("texture"); shader_simple_texture = shader_simple->GetUniformLocation("texture");
@@ -949,33 +961,26 @@ int Render::InitDrawResources(void)
return true; return true;
} }


int Render::CreateGLWindow()
{
InitShaderVar();
UpdateSize();
InitDrawResources();
return true;
}

Render::Render(caca_canvas_t *caca) Render::Render(caca_canvas_t *caca)
: m_cv_screen(caca), : m_cv_screen(caca),
m_cv_setup(caca_create_canvas(1, 1)), m_cv_setup(caca_create_canvas(1, 1)),
m_fps_debug(0), m_fps_debug(0),
m_ready(false), m_ready(false),
m_pause(false),
m_shader(true),
m_shader_remanence(true),
m_shader_glow(true),
m_shader_blur(true),
m_shader_postfx(true),
m_shader_copper(true),
m_shader_color(true),
m_shader_noise(true),
m_shader_mirror(true),
m_shader_radial(true)
m_pause(false)
{ {
m_txt_screen = new TextRender(m_cv_screen, font_size); m_txt_screen = new TextRender(m_cv_screen, font_size);
m_txt_setup = new TextRender(m_cv_setup, font_size); m_txt_setup = new TextRender(m_cv_setup, font_size);

m_flags.shader = false;
m_flags.remanence = true;
m_flags.glow = true;
m_flags.blur = true;
m_flags.postfx = true;
m_flags.copper = true;
m_flags.color = true;
m_flags.noise = true;
m_flags.mirror = true;
m_flags.radial = true;
} }


void Render::TickGame(float seconds) void Render::TickGame(float seconds)
@@ -1096,15 +1101,15 @@ void Render::TickDraw(float seconds)
} }
if (Input::WasPressed(Key::F2)) if (Input::WasPressed(Key::F2))
{ {
m_shader_remanence = !m_shader_remanence;
m_shader_glow = !m_shader_glow;
m_shader_blur = !m_shader_blur;
m_shader_postfx = !m_shader_postfx;
//m_shader_copper = !m_shader_copper;
m_shader_color = !m_shader_color;
m_shader_noise = !m_shader_noise;
m_shader_mirror = !m_shader_mirror;
m_shader_radial = !m_shader_radial;
m_flags.remanence = !m_flags.remanence;
m_flags.glow = !m_flags.glow;
m_flags.blur = !m_flags.blur;
m_flags.postfx = !m_flags.postfx;
//m_flags.copper = !m_flags.copper;
m_flags.color = !m_flags.color;
m_flags.noise = !m_flags.noise;
m_flags.mirror = !m_flags.mirror;
m_flags.radial = !m_flags.radial;
} }
if (Input::WasPressed(Key::F4)) if (Input::WasPressed(Key::F4))
{ {
@@ -1378,7 +1383,10 @@ void Render::TickDraw(float seconds)


if (!m_ready) if (!m_ready)
{ {
CreateGLWindow();
InitShaderVar();
UpdateSize();
InitDrawResources();

m_txt_screen->Init(); m_txt_screen->Init();
m_txt_setup->Init(); m_txt_setup->Init();
m_ready = true; m_ready = true;
@@ -1443,8 +1451,8 @@ void Render::Draw2D()
if (g_setup) if (g_setup)
m_txt_setup->Render(); m_txt_setup->Render();


if (m_shader)
fbo_back->Bind();
if (m_flags.shader)
m_fbos.back->Bind();


glViewport(0, 0, screen_size.x, screen_size.y); glViewport(0, 0, screen_size.x, screen_size.y);


@@ -1463,6 +1471,9 @@ void Render::Draw2D()
if (g_setup) if (g_setup)
m_txt_setup->Blit((screen_size - setup_canvas_size) / 2, setup_canvas_size); m_txt_setup->Blit((screen_size - setup_canvas_size) / 2, setup_canvas_size);


if (m_flags.shader)
m_fbos.back->Unbind();

glMatrixMode(GL_PROJECTION); glMatrixMode(GL_PROJECTION);
mat4 m = mat4::ortho(0, screen_size.x, screen_size.y, 0, -1.f, 1.f); mat4 m = mat4::ortho(0, screen_size.x, screen_size.y, 0, -1.f, 1.f);
glLoadMatrixf(&m[0][0]); glLoadMatrixf(&m[0][0]);
@@ -1473,7 +1484,7 @@ void Render::Draw2D()


void Render::Draw3D() void Render::Draw3D()
{ {
if (!m_shader)
if (!m_flags.shader)
return; return;


RenderContext rc; RenderContext rc;
@@ -1484,173 +1495,185 @@ void Render::Draw3D()
glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(4, GL_FLOAT, 0, fs_quad_vtx); glVertexPointer(4, GL_FLOAT, 0, fs_quad_vtx);


if (m_shader_copper)
if (m_flags.copper)
{ {
// shader copper // shader copper
fbo_tmp->Bind();
m_fbos.tmp->Bind();
shader_copper->Bind(); shader_copper->Bind();
shader_copper->SetUniform(shader_copper_texture, fbo_back->GetTextureUniform(), 0);
shader_copper->SetUniform(shader_copper_texture, m_fbos.back->GetTextureUniform(), 0);
shader_copper->SetUniform(shader_copper_screen_size, (vec2)screen_size); shader_copper->SetUniform(shader_copper_screen_size, (vec2)screen_size);
shader_copper->SetUniform(shader_copper_time, fx_angle); shader_copper->SetUniform(shader_copper_time, fx_angle);
shader_copper->SetUniform(shader_copper_copper, vec4(copper_copper.x, copper_copper.y, copper_copper.z * 16.0f, copper_copper.w * 16.0f)); shader_copper->SetUniform(shader_copper_copper, vec4(copper_copper.x, copper_copper.y, copper_copper.z * 16.0f, copper_copper.w * 16.0f));
shader_copper->SetUniform(shader_copper_mask_color, copper_mask_color); shader_copper->SetUniform(shader_copper_mask_color, copper_mask_color);
m_vdecl->SetStream(m_vbo, shader_copper->GetAttribLocation(VertexUsage::Position, 0));
TraceQuad(); TraceQuad();
shader_color->Unbind(); shader_color->Unbind();
fbo_tmp->Unbind();
m_fbos.tmp->Unbind();
// shader simple // shader simple
fbo_back->Bind();
ShaderSimple(fbo_tmp, 0);
fbo_back->Unbind();
m_fbos.back->Bind();
ShaderSimple(m_fbos.tmp, 0);
m_fbos.back->Unbind();
} }


if (m_shader_remanence)
if (m_flags.remanence)
{ {
// shader remanence // shader remanence
fbo_tmp->Bind();
m_fbos.tmp->Bind();
shader_remanence->Bind(); shader_remanence->Bind();
shader_remanence->SetUniform(shader_remanence_source, fbo_back->GetTextureUniform(), 0);
shader_remanence->SetUniform(shader_remanence_buffer, fbo_buffer->GetTextureUniform(), 1);
shader_remanence->SetUniform(shader_remanence_source, m_fbos.back->GetTextureUniform(), 0);
shader_remanence->SetUniform(shader_remanence_buffer, m_fbos.buffer->GetTextureUniform(), 1);
shader_remanence->SetUniform(shader_remanence_mix, remanence); shader_remanence->SetUniform(shader_remanence_mix, remanence);
m_vdecl->SetStream(m_vbo, shader_remanence->GetAttribLocation(VertexUsage::Position, 0));
TraceQuad(); TraceQuad();
shader_remanence->Unbind(); shader_remanence->Unbind();
fbo_tmp->Unbind();
m_fbos.tmp->Unbind();
// shader simple // shader simple
fbo_back->Bind();
ShaderSimple(fbo_tmp, 0);
fbo_back->Unbind();
m_fbos.back->Bind();
ShaderSimple(m_fbos.tmp, 0);
m_fbos.back->Unbind();
// save previous fbo // save previous fbo
fbo_tmp->Bind();
m_fbos.tmp->Bind();
shader_remanence->Bind(); shader_remanence->Bind();
shader_remanence->SetUniform(shader_remanence_source, fbo_screen->GetTextureUniform(), 0);
shader_remanence->SetUniform(shader_remanence_buffer, fbo_buffer->GetTextureUniform(), 1);
shader_remanence->SetUniform(shader_remanence_source, m_fbos.screen->GetTextureUniform(), 0);
shader_remanence->SetUniform(shader_remanence_buffer, m_fbos.buffer->GetTextureUniform(), 1);
shader_remanence->SetUniform(shader_remanence_mix, buffer); shader_remanence->SetUniform(shader_remanence_mix, buffer);
m_vdecl->SetStream(m_vbo, shader_remanence->GetAttribLocation(VertexUsage::Position, 0));
TraceQuad(); TraceQuad();
shader_remanence->Unbind(); shader_remanence->Unbind();
fbo_tmp->Unbind();
m_fbos.tmp->Unbind();
// shader simple // shader simple
fbo_buffer->Bind();
ShaderSimple(fbo_tmp, 0);
fbo_buffer->Unbind();
m_fbos.buffer->Bind();
ShaderSimple(m_fbos.tmp, 0);
m_fbos.buffer->Unbind();
} }


// shader glow // shader glow
if (m_shader_glow)
if (m_flags.glow)
{ {
// shader blur horizontal // shader blur horizontal
fbo_blur_h->Bind();
m_fbos.blur_h->Bind();
shader_blur_h->Bind(); shader_blur_h->Bind();
shader_blur_h->SetUniform(shader_blur_h_texture, fbo_back->GetTextureUniform(), 0);
shader_blur_h->SetUniform(shader_blur_h_texture, m_fbos.back->GetTextureUniform(), 0);
shader_blur_h->SetUniform(shader_blur_h_radius, glow_large / (float)screen_size.x); shader_blur_h->SetUniform(shader_blur_h_radius, glow_large / (float)screen_size.x);
m_vdecl->SetStream(m_vbo, shader_blur_h->GetAttribLocation(VertexUsage::Position, 0));
TraceQuad(); TraceQuad();
shader_blur_h->Unbind(); shader_blur_h->Unbind();
fbo_blur_h->Unbind();
m_fbos.blur_h->Unbind();
// shader blur vertical // shader blur vertical
fbo_blur_v->Bind();
m_fbos.blur_v->Bind();
shader_blur_v->Bind(); shader_blur_v->Bind();
shader_blur_v->SetUniform(shader_blur_v_texture, fbo_blur_h->GetTextureUniform(), 0);
shader_blur_v->SetUniform(shader_blur_v_texture, m_fbos.blur_h->GetTextureUniform(), 0);
shader_blur_v->SetUniform(shader_blur_v_radius, glow_large / (float)screen_size.y); shader_blur_v->SetUniform(shader_blur_v_radius, glow_large / (float)screen_size.y);
m_vdecl->SetStream(m_vbo, shader_blur_v->GetAttribLocation(VertexUsage::Position, 0));
TraceQuad(); TraceQuad();
shader_blur_v->Unbind(); shader_blur_v->Unbind();
fbo_blur_v->Unbind();
m_fbos.blur_v->Unbind();
// shader blur horizontal // shader blur horizontal
fbo_blur_h->Bind();
m_fbos.blur_h->Bind();
shader_blur_h->Bind(); shader_blur_h->Bind();
shader_blur_h->SetUniform(shader_blur_h_texture, fbo_blur_v->GetTextureUniform(), 0);
shader_blur_h->SetUniform(shader_blur_h_texture, m_fbos.blur_v->GetTextureUniform(), 0);
shader_blur_h->SetUniform(shader_blur_h_radius, glow_small / (float)screen_size.x); shader_blur_h->SetUniform(shader_blur_h_radius, glow_small / (float)screen_size.x);
m_vdecl->SetStream(m_vbo, shader_blur_h->GetAttribLocation(VertexUsage::Position, 0));
TraceQuad(); TraceQuad();
shader_blur_h->Unbind(); shader_blur_h->Unbind();
fbo_blur_h->Unbind();
m_fbos.blur_h->Unbind();
// shader blur vertical // shader blur vertical
fbo_blur_v->Bind();
m_fbos.blur_v->Bind();
shader_blur_v->Bind(); shader_blur_v->Bind();
shader_blur_v->SetUniform(shader_blur_v_texture, fbo_blur_h->GetTextureUniform(), 0);
shader_blur_v->SetUniform(shader_blur_v_texture, m_fbos.blur_h->GetTextureUniform(), 0);
shader_blur_v->SetUniform(shader_blur_v_radius, glow_small / (float)screen_size.y); shader_blur_v->SetUniform(shader_blur_v_radius, glow_small / (float)screen_size.y);
m_vdecl->SetStream(m_vbo, shader_blur_v->GetAttribLocation(VertexUsage::Position, 0));
TraceQuad(); TraceQuad();
shader_blur_v->Unbind(); shader_blur_v->Unbind();
fbo_blur_v->Unbind();
m_fbos.blur_v->Unbind();
// shader glow // shader glow
fbo_screen->Bind();
m_fbos.screen->Bind();
shader_glow->Bind(); shader_glow->Bind();
shader_glow->SetUniform(shader_glow_glow, fbo_blur_v->GetTextureUniform(), 0);
shader_glow->SetUniform(shader_glow_source, fbo_back->GetTextureUniform(), 1);
shader_glow->SetUniform(shader_glow_glow, m_fbos.blur_v->GetTextureUniform(), 0);
shader_glow->SetUniform(shader_glow_source, m_fbos.back->GetTextureUniform(), 1);
shader_glow->SetUniform(shader_glow_mix, glow_mix); shader_glow->SetUniform(shader_glow_mix, glow_mix);
m_vdecl->SetStream(m_vbo, shader_glow->GetAttribLocation(VertexUsage::Position, 0));
TraceQuad(); TraceQuad();
shader_glow->Unbind(); shader_glow->Unbind();
fbo_screen->Unbind();
m_fbos.screen->Unbind();
} }
else else
{ {
// shader simple // shader simple
fbo_screen->Bind();
ShaderSimple(fbo_back, 0);
fbo_screen->Unbind();
m_fbos.screen->Bind();
ShaderSimple(m_fbos.back, 0);
m_fbos.screen->Unbind();
} }


if (m_shader_color)
if (m_flags.color)
{ {
// shader color // shader color
fbo_tmp->Bind();
m_fbos.tmp->Bind();
shader_color->Bind(); shader_color->Bind();
shader_color->SetUniform(shader_color_texture, fbo_screen->GetTextureUniform(), 0);
shader_color->SetUniform(shader_color_texture, m_fbos.screen->GetTextureUniform(), 0);
shader_color->SetUniform(shader_color_screen_size, (vec2)screen_size); shader_color->SetUniform(shader_color_screen_size, (vec2)screen_size);
shader_color->SetUniform(shader_color_filter, color_filter); shader_color->SetUniform(shader_color_filter, color_filter);
shader_color->SetUniform(shader_color_color, color_color); shader_color->SetUniform(shader_color_color, color_color);
shader_color->SetUniform(shader_color_flash, flash_value); shader_color->SetUniform(shader_color_flash, flash_value);
m_vdecl->SetStream(m_vbo, shader_color->GetAttribLocation(VertexUsage::Position, 0));
TraceQuad(); TraceQuad();
shader_color->Unbind(); shader_color->Unbind();
fbo_tmp->Unbind();
m_fbos.tmp->Unbind();
// shader simple // shader simple
fbo_screen->Bind();
ShaderSimple(fbo_tmp, 0);
fbo_screen->Unbind();
m_fbos.screen->Bind();
ShaderSimple(m_fbos.tmp, 0);
m_fbos.screen->Unbind();
} }


if (m_shader_noise)
if (m_flags.noise)
{ {
// shader noise // shader noise
fbo_tmp->Bind();
m_fbos.tmp->Bind();
shader_noise->Bind(); shader_noise->Bind();
shader_noise->SetUniform(shader_noise_texture, fbo_screen->GetTextureUniform(), 0);
shader_noise->SetUniform(shader_noise_texture, m_fbos.screen->GetTextureUniform(), 0);
shader_noise->SetUniform(shader_noise_screen_size, (vec2)screen_size); shader_noise->SetUniform(shader_noise_screen_size, (vec2)screen_size);
shader_noise->SetUniform(shader_noise_time, fx_angle); shader_noise->SetUniform(shader_noise_time, fx_angle);
shader_noise->SetUniform(shader_noise_offset, noise_offset); shader_noise->SetUniform(shader_noise_offset, noise_offset);
shader_noise->SetUniform(shader_noise_noise, noise_noise); shader_noise->SetUniform(shader_noise_noise, noise_noise);
shader_noise->SetUniform(shader_noise_retrace, noise_retrace); shader_noise->SetUniform(shader_noise_retrace, noise_retrace);
m_vdecl->SetStream(m_vbo, shader_noise->GetAttribLocation(VertexUsage::Position, 0));
TraceQuad(); TraceQuad();
shader_noise->Unbind(); shader_noise->Unbind();
fbo_tmp->Unbind();
m_fbos.tmp->Unbind();
// shader simple // shader simple
fbo_screen->Bind();
ShaderSimple(fbo_tmp, 0);
fbo_screen->Unbind();
m_fbos.screen->Bind();
ShaderSimple(m_fbos.tmp, 0);
m_fbos.screen->Unbind();
} }


if (m_shader_blur)
if (m_flags.blur)
{ {
// shader blur horizontal // shader blur horizontal
fbo_tmp->Bind();
m_fbos.tmp->Bind();
shader_blur_h->Bind(); shader_blur_h->Bind();
shader_blur_h->SetUniform(shader_blur_h_texture, fbo_screen->GetTextureUniform(), 0);
shader_blur_h->SetUniform(shader_blur_h_texture, m_fbos.screen->GetTextureUniform(), 0);
shader_blur_h->SetUniform(shader_blur_h_radius, blur / (float)screen_size.x); shader_blur_h->SetUniform(shader_blur_h_radius, blur / (float)screen_size.x);
m_vdecl->SetStream(m_vbo, shader_blur_h->GetAttribLocation(VertexUsage::Position, 0));
TraceQuad(); TraceQuad();
shader_blur_h->Unbind(); shader_blur_h->Unbind();
fbo_tmp->Unbind();
m_fbos.tmp->Unbind();
// shader blur vertical // shader blur vertical
fbo_screen->Bind();
m_fbos.screen->Bind();
shader_blur_v->Bind(); shader_blur_v->Bind();
shader_blur_v->SetUniform(shader_blur_v_texture, fbo_tmp->GetTextureUniform(), 0);
shader_blur_v->SetUniform(shader_blur_v_texture, m_fbos.tmp->GetTextureUniform(), 0);
shader_blur_v->SetUniform(shader_blur_v_radius, blur / (float)screen_size.y); shader_blur_v->SetUniform(shader_blur_v_radius, blur / (float)screen_size.y);
m_vdecl->SetStream(m_vbo, shader_blur_v->GetAttribLocation(VertexUsage::Position, 0));
TraceQuad(); TraceQuad();
shader_blur_v->Unbind(); shader_blur_v->Unbind();
fbo_screen->Unbind();
m_fbos.screen->Unbind();
} }


if (m_shader_postfx)
if (m_flags.postfx)
{ {
// shader postfx // shader postfx
fbo_front->Bind();
m_fbos.front->Bind();
shader_postfx->Bind(); shader_postfx->Bind();
shader_postfx->SetUniform(shader_postfx_texture, fbo_screen->GetTextureUniform(), 0);
shader_postfx->SetUniform(shader_postfx_texture, m_fbos.screen->GetTextureUniform(), 0);
shader_postfx->SetUniform(shader_postfx_screen_size, (vec2)screen_size); shader_postfx->SetUniform(shader_postfx_screen_size, (vec2)screen_size);
shader_postfx->SetUniform(shader_postfx_ratio_2d, (vec2)ratio_2d * 0.5f); shader_postfx->SetUniform(shader_postfx_ratio_2d, (vec2)ratio_2d * 0.5f);
shader_postfx->SetUniform(shader_postfx_time, fx_angle); shader_postfx->SetUniform(shader_postfx_time, fx_angle);
@@ -1669,54 +1692,57 @@ void Render::Draw3D()
shader_postfx->SetUniform(shader_postfx_corner, postfx_corner); shader_postfx->SetUniform(shader_postfx_corner, postfx_corner);
shader_postfx->SetUniform(shader_postfx_sync, (float)fabs(sync_value * cosf((main_angle - sync_angle) * 6.0f))); shader_postfx->SetUniform(shader_postfx_sync, (float)fabs(sync_value * cosf((main_angle - sync_angle) * 6.0f)));
shader_postfx->SetUniform(shader_postfx_beat, (float)fabs(beat_value * cosf((main_angle - beat_angle) * 6.0f))); shader_postfx->SetUniform(shader_postfx_beat, (float)fabs(beat_value * cosf((main_angle - beat_angle) * 6.0f)));
m_vdecl->SetStream(m_vbo, shader_postfx->GetAttribLocation(VertexUsage::Position, 0));
TraceQuad(); TraceQuad();
shader_postfx->Unbind(); shader_postfx->Unbind();
fbo_front->Unbind();
m_fbos.front->Unbind();
} }
else else
{ {
// shader simple // shader simple
fbo_front->Bind();
ShaderSimple(fbo_screen, 0);
fbo_front->Unbind();
m_fbos.front->Bind();
ShaderSimple(m_fbos.screen, 0);
m_fbos.front->Unbind();
} }


if (m_shader_mirror)
if (m_flags.mirror)
{ {
// shader mirror // shader mirror
fbo_tmp->Bind();
m_fbos.tmp->Bind();
shader_mirror->Bind(); shader_mirror->Bind();
shader_mirror->SetUniform(shader_mirror_texture, fbo_front->GetTextureUniform(), 0);
shader_mirror->SetUniform(shader_mirror_texture, m_fbos.front->GetTextureUniform(), 0);
shader_mirror->SetUniform(shader_mirror_screen_size, (vec2)screen_size); shader_mirror->SetUniform(shader_mirror_screen_size, (vec2)screen_size);
shader_mirror->SetUniform(shader_mirror_mirror, vec4(mirror.x * 0.1f, mirror.y * 0.1f, mirror.z, mirror.w)); shader_mirror->SetUniform(shader_mirror_mirror, vec4(mirror.x * 0.1f, mirror.y * 0.1f, mirror.z, mirror.w));
m_vdecl->SetStream(m_vbo, shader_mirror->GetAttribLocation(VertexUsage::Position, 0));
TraceQuad(); TraceQuad();
shader_mirror->Unbind(); shader_mirror->Unbind();
fbo_tmp->Unbind();
m_fbos.tmp->Unbind();
// shader simple // shader simple
fbo_front->Bind();
ShaderSimple(fbo_tmp, 0);
fbo_front->Unbind();
m_fbos.front->Bind();
ShaderSimple(m_fbos.tmp, 0);
m_fbos.front->Unbind();
} }


if (m_shader_radial)
if (m_flags.radial)
{ {
// shader radial blur // shader radial blur
fbo_tmp->Bind();
m_fbos.tmp->Bind();
shader_radial->Bind(); shader_radial->Bind();
shader_radial->SetUniform(shader_radial_texture, fbo_front->GetTextureUniform(), 0);
shader_radial->SetUniform(shader_radial_texture, m_fbos.front->GetTextureUniform(), 0);
shader_radial->SetUniform(shader_radial_screen_size, (vec2)screen_size); shader_radial->SetUniform(shader_radial_screen_size, (vec2)screen_size);
shader_radial->SetUniform(shader_radial_radial, vec4(radial.x, radial.y, radial.z, radial.w * 0.1f)); shader_radial->SetUniform(shader_radial_radial, vec4(radial.x, radial.y, radial.z, radial.w * 0.1f));
m_vdecl->SetStream(m_vbo, shader_radial->GetAttribLocation(VertexUsage::Position, 0));
TraceQuad(); TraceQuad();
shader_radial->Unbind(); shader_radial->Unbind();
fbo_tmp->Unbind();
m_fbos.tmp->Unbind();
// shader simple // shader simple
fbo_front->Bind();
ShaderSimple(fbo_tmp, 0);
fbo_front->Unbind();
m_fbos.front->Bind();
ShaderSimple(m_fbos.tmp, 0);
m_fbos.front->Unbind();
} }


// shader simple // shader simple
ShaderSimple(fbo_front, 0);
ShaderSimple(m_fbos.front, 0);


glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_VERTEX_ARRAY);
} }


+ 16
- 11
neercs/video/render.h View File

@@ -21,7 +21,6 @@ protected:
void Draw3D(); void Draw3D();


private: private:
int CreateGLWindow();
int InitDrawResources(); int InitDrawResources();
void ShaderSimple(Framebuffer *fbo_output, int n); void ShaderSimple(Framebuffer *fbo_output, int n);
void TraceQuad(); void TraceQuad();
@@ -33,21 +32,27 @@ private:


caca_canvas_t *m_cv_screen, *m_cv_setup; caca_canvas_t *m_cv_screen, *m_cv_setup;
class TextRender *m_txt_screen, *m_txt_setup; class TextRender *m_txt_screen, *m_txt_setup;
VertexDeclaration *m_vdecl;
VertexBuffer *m_vbo;


Entity *m_fps_debug; Entity *m_fps_debug;


struct
{
Framebuffer *back, *screen, *front, *buffer,
*blur_h, *blur_v, *tmp;
}
m_fbos;

bool m_ready; bool m_ready;
bool m_pause; bool m_pause;
bool m_shader;
bool m_shader_remanence;
bool m_shader_glow;
bool m_shader_blur;
bool m_shader_postfx;
bool m_shader_copper;
bool m_shader_color;
bool m_shader_noise;
bool m_shader_mirror;
bool m_shader_radial;

struct
{
bool shader, remanence, glow, blur, postfx,
copper, color, noise, mirror, radial;
}
m_flags;
}; };


#endif // __VIDEO_RENDER_H__ #endif // __VIDEO_RENDER_H__

+ 3
- 2
neercs/video/simple.lolfx View File

@@ -2,12 +2,13 @@


#version 120 #version 120


attribute vec4 in_Position;
varying vec2 pass_TexCoord; varying vec2 pass_TexCoord;


void main() void main()
{ {
gl_Position = gl_Vertex;
pass_TexCoord = vec2(0.5, 0.5) + 0.5 * gl_Vertex.xy;
gl_Position = in_Position;
pass_TexCoord = vec2(0.5, 0.5) + 0.5 * in_Position.xy;
} }


[frag.glsl] [frag.glsl]


Loading…
Cancel
Save