#include <msp/gl/object.h>
#include <msp/gl/pipeline.h>
#include <msp/gl/program.h>
-#include <msp/gl/programbuilder.h>
#include <msp/gl/renderer.h>
+#include <msp/gl/resources.h>
#include <msp/gl/shader.h>
#include <msp/gl/shadowmap.h>
#include <msp/gl/simplescene.h>
Msp::Graphics::Window window;
Msp::Graphics::GLContext gl_context;
Msp::Input::Keyboard keyboard;
+ GL::Resources resources;
GL::Program skybox_shprog;
GL::Technique skybox_tech;
GL::TextureCube skybox_tex;
+ GL::Sampler linear_clamped_sampler;
ObjectData skybox_data;
- GL::Program shadow_shprog;
+ const GL::Program &shadow_shprog;
GL::Program ground_shprog;
GL::ProgramData ground_shdata;
GL::Texture2D tiles_normalmap;
GL::Texture2D sand_texture;
GL::Texture2D sand_normalmap;
+ GL::Sampler linear_sampler;
+ GL::Sampler mipmap_sampler;
GL::Technique ground_tech;
ObjectData ground_data;
"{\n"
" return mix(texture(texture1, texcoord.xy*3.0), texture(texture2, texcoord.xy), ground_type);\n"
"}\n"
- "vec4 get_normal_sample()\n"
+ "vec4 get_fragment_normal()\n"
"{\n"
" return mix(texture(normalmap1, texcoord.xy*3.0).rgb, texture(normalmap2, texcoord.xy).rgb, ground_type);\n"
"}\n";
gl_context(window),
keyboard(window),
skybox_shprog(skybox_src),
- shadow_shprog("occluder.glsl"),
+ shadow_shprog(resources.get<GL::Program>("_occluder.glsl.shader")),
ground_shprog(ground_src),
cube_shprog(cube_src),
cube_shadow_shprog(string(cube_src)+cube_shadow_src_tail),
view(window, gl_context),
pipeline(view),
- shadow_scene(2048, scene, light),
- bloom(window.get_width(), window.get_height()),
+ shadow_scene(resources, 2048, scene, light),
+ bloom(resources, window.get_width(), window.get_height()),
+ colorcurve(resources),
env_pipeline(512, 512),
camera_angle(0),
camera_stopped(false),
void DesertPillars::create_skybox()
{
- skybox_tex.storage(GL::SRGB, 128);
- skybox_tex.set_min_filter(GL::LINEAR);
- skybox_tex.set_wrap(GL::CLAMP_TO_EDGE);
+ skybox_tex.storage(GL::SRGB8, 128, 1);
+ linear_clamped_sampler.set_min_filter(GL::LINEAR);
+ linear_clamped_sampler.set_wrap(GL::CLAMP_TO_EDGE);
for(unsigned i=0; i<6; ++i)
create_skybox_face(skybox_tex, skybox_tex.enumerate_faces(i));
GL::RenderPass &pass = skybox_tech.add_pass(0);
pass.set_shader_program(&skybox_shprog, 0);
- pass.set_texture(0, &skybox_tex);
+ pass.set_texture(0, &skybox_tex, &linear_clamped_sampler);
// The shader will use the vertex coordinates to initialize texture coordinates as well
skybox_data.mesh = new GL::Mesh(GL::VERTEX3);
pixels[i+2] = 160;
}
}
- texture.image(face, 0, GL::RGB, GL::UNSIGNED_BYTE, pixels);
+ texture.image(face, 0, pixels);
delete[] pixels;
}
{
unsigned width = 256;
unsigned height = 256;
- tiles_texture.storage(GL::RGB, width, height);
- tiles_texture.set_min_filter(GL::LINEAR);
- tiles_normalmap.storage(GL::RGB, width, height);
- tiles_normalmap.set_min_filter(GL::LINEAR);
+ tiles_texture.storage(GL::RGB8, width, height, 1);
+ tiles_normalmap.storage(GL::RGB8, width, height, 1);
+ linear_sampler.set_min_filter(GL::LINEAR);
GL::Mesh tiles((GL::VERTEX3, GL::NORMAL3, GL::COLOR4_UBYTE));
4, 4, 3, 3, 4, 1, 3, 2,
2, 3, 2, 2, 3, 3, 3, 2 };
+ {
GL::MeshBuilder bld(tiles);
// Create a dark background
bld.vertex(coords[i*4+order[32+l*2]], coords[j*4+order[32+l*2+1]], bevel);
bld.end();
}
+ }
GL::Program shprog(texture_src);
unsigned width = 512;
unsigned height = 512;
- sand_texture.storage(GL::SRGB, width/16, height/16);
- sand_texture.set_min_filter(GL::LINEAR_MIPMAP_LINEAR);
- sand_texture.set_max_anisotropy(4);
+ sand_texture.storage(GL::SRGB8, width/16, height/16);
sand_texture.set_auto_generate_mipmap(true);
- sand_normalmap.storage(GL::RGB, width, height);
- sand_normalmap.set_min_filter(GL::LINEAR_MIPMAP_LINEAR);
- sand_normalmap.set_max_anisotropy(4);
+ sand_normalmap.storage(GL::RGB8, width, height);
sand_normalmap.set_auto_generate_mipmap(true);
+ mipmap_sampler.set_min_filter(GL::LINEAR_MIPMAP_LINEAR);
+ mipmap_sampler.set_max_anisotropy(4);
unsigned char *pixels = new unsigned char[width*height*3];
unsigned char *bump = new unsigned char[width*height];
pixels[i+2] = 160;
bump[x+y*width] = rand();
}
- sand_texture.image(0, GL::RGB, GL::UNSIGNED_BYTE, pixels);
+ sand_texture.image(0, pixels);
gaussian_blur(bump, width, height);
create_normalmap(bump, pixels, width, height, 4);
- sand_normalmap.image(0, GL::RGB, GL::UNSIGNED_BYTE, pixels);
+ sand_normalmap.image(0, pixels);
delete[] pixels;
delete[] bump;
}
GL::RenderPass *pass = &ground_tech.add_pass(0);
pass->set_shader_program(&ground_shprog, &ground_shdata);
- pass->set_texture(0, &tiles_texture);
- pass->set_texture(1, &tiles_normalmap);
- pass->set_texture(2, &sand_texture);
- pass->set_texture(3, &sand_normalmap);
+ pass->set_texture(0, &tiles_texture, &linear_sampler);
+ pass->set_texture(1, &tiles_normalmap, &linear_sampler);
+ pass->set_texture(2, &sand_texture, &mipmap_sampler);
+ pass->set_texture(3, &sand_normalmap, &mipmap_sampler);
/* No shadow pass here; the ground only receives shadows, but doesn't cast
them. */
cube_data.object = new GL::Object(cube_data.mesh, &cube_tech);
cube = new Cube(*cube_data.object);
- env_cube = new GL::EnvironmentMap(512, *cube, env_pipeline);
+ env_cube = new GL::EnvironmentMap(resources, 512, *cube, env_pipeline);
scene.add(*env_cube);
}