示例#1
0
文件: gx.c 项目: LWSS/gx
void render_game(struct GameMemory *memory, struct Renderer *renderer, uint32 screen_width, uint32 screen_height)
{
    struct GameState *game_state = (struct GameState *)memory->game_memory;
    struct RenderBuffer *render_buffer = (struct RenderBuffer *)memory->render_memory;

    float aspect_ratio = (float)screen_width / (float)screen_height;
    mat4 projection_matrix = mat4_orthographic(-game_state->camera.zoom/2.0f, game_state->camera.zoom/2.0f,
                                               -game_state->camera.zoom/2.0f / aspect_ratio, game_state->camera.zoom/2.0f / aspect_ratio,
                                               0.0f, 1.0f);
    mat4 view_matrix = mat4_look_at(vec3_new(game_state->camera.position.x, game_state->camera.position.y, 0.0f), vec3_new(game_state->camera.position.x, game_state->camera.position.y, -1.0f), vec3_new(0, 1, 0));
    mat4 view_projection_matrix = mat4_mul(projection_matrix, view_matrix);

    update_ubo(renderer->camera_ubo, sizeof(mat4), &view_projection_matrix);

    bind_program(renderer->line_program);
    draw_world_line_buffer(renderer, render_buffer, renderer->line_program);
    bind_program(0);

    bind_program(renderer->quad_program);
    draw_world_quad_buffer(&renderer->sprite_batch, render_buffer);
    bind_program(0);

    draw_buildings(game_state, renderer);
    draw_ships(game_state, renderer);
    draw_projectiles(game_state, renderer);

    view_projection_matrix = mat4_orthographic(0, screen_width, screen_height, 0, 0, 1);
    update_ubo(renderer->camera_ubo, sizeof(mat4), &view_projection_matrix);

    bind_program(renderer->quad_program);
    draw_screen_quad_buffer(&renderer->sprite_batch, render_buffer);
    bind_program(0);

    draw_frame_text_buffer(renderer, render_buffer);
}
示例#2
0
void model_renderer::rtt(const unsigned int& user_id) {
	update_ubo(user_id);
	
	r->start_draw(mesh_fbo);
	r->start_2d_draw();
	r->clear();
	
	static const GLenum draw_buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
	glDrawBuffers(2, draw_buffers);
	
	gl3shader shd = s->get_gl3shader("RTT_MESH");
	shd->use();
	
	shd->attribute_array("in_vertex", draw_vertices_vbo, 3);
	shd->attribute_array("in_normal", draw_normals_vbo, 3);
	shd->attribute_array("in_tex_coord", draw_tex_coords_vbo, 2);
	
	// additional ins/uniforms:
	shd->attribute_array("weights", bmodel->weights_vbo, 4);
	shd->attribute_array("bone_indices", bmodel->bone_indices_vbo, 4);
	shd->block("bone_data_buffer", bones_ubo);
	shd->uniform("offset", offset);
	
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, draw_indices_vbo);
	glDrawElements(GL_TRIANGLES, (GLsizei)draw_index_count, GL_UNSIGNED_INT, nullptr);
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
	
	shd->disable();
	r->stop_2d_draw();
	r->stop_draw();
}