void RenderBatchTriangle::flush(GraphicContext &gc) { if (position > 0) { gc.set_program_object(program_sprite); int gpu_index; VertexArrayVector<SpriteVertex> gpu_vertices(batch_buffer->get_vertex_buffer(gc, gpu_index)); if (prim_array[gpu_index].is_null()) { prim_array[gpu_index] = PrimitivesArray(gc); prim_array[gpu_index].set_attributes(0, gpu_vertices, cl_offsetof(SpriteVertex, position)); prim_array[gpu_index].set_attributes(1, gpu_vertices, cl_offsetof(SpriteVertex, color)); prim_array[gpu_index].set_attributes(2, gpu_vertices, cl_offsetof(SpriteVertex, texcoord)); prim_array[gpu_index].set_attributes(3, gpu_vertices, cl_offsetof(SpriteVertex, texindex)); if (glyph_blend.is_null()) { BlendStateDescription blend_desc; blend_desc.set_blend_function(blend_constant_color, blend_one_minus_src_color, blend_zero, blend_one); glyph_blend = BlendState(gc, blend_desc); } } gpu_vertices.upload_data(gc, 0, vertices, position); for (int i = 0; i < num_current_textures; i++) gc.set_texture(i, current_textures[i]); if (use_glyph_program) { gc.set_blend_state(glyph_blend, constant_color); gc.draw_primitives(type_triangles, position, prim_array[gpu_index]); gc.reset_blend_state(); } else { gc.draw_primitives(type_triangles, position, prim_array[gpu_index]); } for (int i = 0; i < num_current_textures; i++) gc.reset_texture(i); gc.reset_program_object(); position = 0; for (int i = 0; i < num_current_textures; i++) current_textures[i] = Texture2D(); num_current_textures = 0; } }
void RenderBatchPoint::flush(GraphicContext &gc) { if (position > 0) { gc.set_program_object(program_color_only); int gpu_index; VertexArrayVector<PointVertex> gpu_vertices(batch_buffer->get_vertex_buffer(gc, gpu_index)); if (prim_array[gpu_index].is_null()) { prim_array[gpu_index] = PrimitivesArray(gc); prim_array[gpu_index].set_attributes(0, gpu_vertices, cl_offsetof(PointVertex, position)); prim_array[gpu_index].set_attributes(1, gpu_vertices, cl_offsetof(PointVertex, color)); } gpu_vertices.upload_data(gc, 0, vertices, position); gc.draw_primitives(type_points, position, prim_array[gpu_index]); gc.reset_program_object(); position = 0; } }
void App::draw_texture(GraphicContext &gc, const Rectf &rect, const Colorf &color, const Rectf &texture_unit1_coords) { Vec2f positions[6] = { Vec2f(rect.left, rect.top), Vec2f(rect.right, rect.top), Vec2f(rect.left, rect.bottom), Vec2f(rect.right, rect.top), Vec2f(rect.left, rect.bottom), Vec2f(rect.right, rect.bottom) }; Vec2f tex1_coords[6] = { Vec2f(texture_unit1_coords.left, texture_unit1_coords.top), Vec2f(texture_unit1_coords.right, texture_unit1_coords.top), Vec2f(texture_unit1_coords.left, texture_unit1_coords.bottom), Vec2f(texture_unit1_coords.right, texture_unit1_coords.top), Vec2f(texture_unit1_coords.left, texture_unit1_coords.bottom), Vec2f(texture_unit1_coords.right, texture_unit1_coords.bottom) }; PrimitivesArray prim_array(gc); prim_array.set_attributes(0, positions); prim_array.set_attribute(1, color); prim_array.set_attributes(2, tex1_coords); gc.draw_primitives(cl_triangles, 6, prim_array); }
void Model_Impl::Draw(GraphicContext &gc, GraphicStore *gs, const Mat4f &modelview_matrix) { Mat4f matrix_modelview_projection = gs->camera_projection * modelview_matrix; Mat3f normal_matrix = Mat3f(modelview_matrix); normal_matrix.inverse(); normal_matrix.transpose(); PrimitivesArray prim_array(gc); prim_array.set_attributes(0, vbo_positions, 3, type_float, 0); prim_array.set_attributes(1, vbo_normals, 3, type_float, 0); gs->shader_color.SetMaterial(material_shininess, material_emission, material_ambient, material_specular); gs->shader_color.Use(gc, modelview_matrix, matrix_modelview_projection, Mat4f(normal_matrix)); gc.draw_primitives(type_triangles, vbo_size, prim_array); }
void ParticleObject::Draw(GraphicContext &gc, GraphicStore *gs, const Mat4f &modelview_matrix) { Mat4f matrix_modelview_projection = gs->camera_projection * modelview_matrix; PrimitivesArray prim_array(gc); prim_array.set_attributes(0, object_positions_vbo, 3, type_float, 0); prim_array.set_attributes(1, object_colours_vbo, 4, type_float, 0); gs->shader_color_geometry.Use(gc, matrix_modelview_projection); gc.set_texture(0, gs->texture_ball); gc.draw_primitives(type_points, num_points, prim_array); gc.reset_texture(0); }
void HSV::render_texture(Canvas &canvas, ProgramObject &program, Texture &texture, float hue_offset) { GraphicContext gc = canvas.get_gc(); Rectf rect(0.0f, 0.0f, (float)gc.get_width(), (float)gc.get_height()); Rectf texture_unit1_coords(0.0f, 0.0f, 1.0f, 1.0f); Vec2f positions[6] = { Vec2f(rect.left, rect.top), Vec2f(rect.right, rect.top), Vec2f(rect.left, rect.bottom), Vec2f(rect.right, rect.top), Vec2f(rect.left, rect.bottom), Vec2f(rect.right, rect.bottom) }; Vec2f tex1_coords[6] = { Vec2f(texture_unit1_coords.left, texture_unit1_coords.top), Vec2f(texture_unit1_coords.right, texture_unit1_coords.top), Vec2f(texture_unit1_coords.left, texture_unit1_coords.bottom), Vec2f(texture_unit1_coords.right, texture_unit1_coords.top), Vec2f(texture_unit1_coords.left, texture_unit1_coords.bottom), Vec2f(texture_unit1_coords.right, texture_unit1_coords.bottom) }; PrimitivesArray primarray(gc); VertexArrayVector<Vec2f> gpu_positions = VertexArrayVector<Vec2f>(gc, positions, 6); VertexArrayVector<Vec2f> gpu_tex1_coords = VertexArrayVector<Vec2f>(gc, tex1_coords, 6); primarray.set_attributes(0, gpu_positions); primarray.set_attributes(1, gpu_tex1_coords); ProgramUniforms buffer; buffer.cl_ModelViewProjectionMatrix = canvas.get_projection() * canvas.get_modelview(); buffer.HueOffset0 = hue_offset; UniformVector<ProgramUniforms> uniform_vector(gc, &buffer, 1); gc.set_uniform_buffer(0, uniform_vector); gc.set_texture(0, texture); gc.set_program_object(program); gc.draw_primitives(type_triangles, 6, primarray); gc.reset_program_object(); gc.reset_texture(0); }
void BloomPass::run(GraphicContext &gc) { final_color->set_min_filter(filter_linear); final_color->set_mag_filter(filter_linear); ScopeTimeFunction(); setup_bloom_extract(gc); gc.set_frame_buffer(fb_bloom_extract); gc.set_viewport(bloom_contribution->get_size()); gc.set_texture(0, final_color.get()); gc.set_blend_state(blend_state); gc.set_program_object(bloom_shader); gc.draw_primitives(type_triangles, 6, rect_primarray); gc.reset_program_object(); gc.reset_texture(0); gc.reset_frame_buffer(); bloom_blur.blur(gc, tf_rgba8, 4.0f, 15); }
int App::start(const std::vector<std::string> &args) { OpenGLWindowDescription description; description.set_title("UniformBlock Shader"); //description.set_version(3, 1, false); description.set_size(Size(1024, 768), true); DisplayWindow window(description); InputDevice keyboard = window.get_ic().get_keyboard(); GraphicContext gc = window.get_gc(); Slot slot_input_up = (window.get_ic().get_keyboard()).sig_key_up().connect(this, &App::on_input_up); Slot slot_window_close = window.sig_window_close().connect(this, &App::window_close); // Load and link shaders ProgramObject shader = ProgramObject::load(gc, "Resources/vertex_shader.glsl", "Resources/fragment_shader.glsl"); shader.bind_attribute_location(0, "Position"); if (!shader.link()) throw Exception("Unable to link shader program: Error:" + shader.get_info_log()); int block_size = shader.get_uniform_block_size("TestBlock"); const int num_blocks = 16; ProgramUniformBlock block(gc, block_size * num_blocks); std::vector<float> data_to_upload; data_to_upload.resize((num_blocks * block_size) / sizeof(float) ); float test_colour = 1.0f; for (int cnt=0; cnt<num_blocks; cnt++) { int offset = cnt * block_size / sizeof(float) ; data_to_upload[offset + 0] = test_colour; data_to_upload[offset + 1] = 0.5f; data_to_upload[offset + 2] = 1.0f; test_colour -= 0.05f; } block.upload_data(0, &data_to_upload[0], block_size * num_blocks); quit = false; Font font(gc, "tahoma", 32); clan::ubyte64 startTime = System::get_time(); //// Test code //GLuint uniform_index = -1; //const char *names[] = {"src_color"}; //glGetUniformIndices(handle, 1, names, &uniform_index); //if (uniform_index >=0) //{ // GLint offset; // GLint singleSize; // GLint uniform_type; // glGetActiveUniformsiv(handle, 1, &uniform_index, GL_UNIFORM_TYPE, &uniform_type); // glGetActiveUniformsiv(handle, 1, &uniform_index, GL_UNIFORM_OFFSET, &offset); // glGetActiveUniformsiv(handle, 1, &uniform_index, GL_UNIFORM_SIZE, &singleSize); // if ((uniform_type != GL_FLOAT_VEC3) || (offset !=0) || (singleSize != 1)) // { // throw Exception("well it seems it does not work"); // } //} while (!quit) { gc.clear(Colorf(0.1f, 0.1f, 0.2f)); OpenGL::check_error(); for (int test_run_y=0; test_run_y < 16; test_run_y++) { shader.set_uniform_block("TestBlock", block, test_run_y*block_size); for (int test_run_x=0; test_run_x < 16; test_run_x++) { Vec2f positions[3]; float size = 32.0f; positions[0].x = test_run_x * size; positions[0].y = test_run_y * size + size; positions[1].x = test_run_x * size + size; positions[1].y = test_run_y * size + size; positions[2].x = test_run_x * size + size; positions[2].y = test_run_y * size; PrimitivesArray prim_array(gc); prim_array.set_attributes(0, positions); gc.set_program_object(shader, cl_program_matrix_modelview_projection); gc.draw_primitives(cl_triangles, 3, prim_array); gc.reset_program_object(); } } font.draw_text(gc, 32, 200, "Hello World"); window.flip(1); KeepAlive::process(); } return 0; }