static bool init_buffers(struct vl_compositor *c) { struct pipe_vertex_element vertex_elems[3]; assert(c); /* * Create our vertex buffer and vertex buffer elements */ c->vertex_buf.stride = sizeof(struct vertex2f) + sizeof(struct vertex4f) * 2; c->vertex_buf.buffer_offset = 0; create_vertex_buffer(c); vertex_elems[0].src_offset = 0; vertex_elems[0].instance_divisor = 0; vertex_elems[0].vertex_buffer_index = 0; vertex_elems[0].src_format = PIPE_FORMAT_R32G32_FLOAT; vertex_elems[1].src_offset = sizeof(struct vertex2f); vertex_elems[1].instance_divisor = 0; vertex_elems[1].vertex_buffer_index = 0; vertex_elems[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; vertex_elems[2].src_offset = sizeof(struct vertex2f) + sizeof(struct vertex4f); vertex_elems[2].instance_divisor = 0; vertex_elems[2].vertex_buffer_index = 0; vertex_elems[2].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; c->vertex_elems_state = c->pipe->create_vertex_elements_state(c->pipe, 3, vertex_elems); return true; }
int main(int argc, char *argv[]) { // 初始化GLUT,可以直接从命令行传入参数如 // '-sync': 禁止X系统天然的异步特性 // '-gldebug': 自动检测GL的错误信息,并显示出来 glutInit(&argc, argv); // 配置GLUT选项 // GLUT_DOUBLE: 启动双缓冲(一个buffer用来绘制背景,另一个显示) glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); // 创建窗口 glutInitWindowSize(512, 384); glutInitWindowPosition(100, 100); glutCreateWindow(argv[0]); // GLUT的回调函数,这个函数会连续的被GLUT的内部循环调用 glutDisplayFunc(RenderSceneCB); // 加上这句之后显示了动态的效果?? glutIdleFunc(RenderSceneCB); // 颜色RGBA四个通道,取值范围0.0-1.0 glClearColor(0.0f, 0.0f, 0.0f, 0.0f); compile_shaders(); create_vertex_buffer(); // 进入GLUT的内部循环 glutMainLoop(); return 0; }
static void gen_vertex_data(struct vl_compositor *c, struct vl_compositor_state *s, struct u_rect *dirty) { struct vertex2f *vb; struct pipe_transfer *buf_transfer; unsigned i; assert(c); vb = pipe_buffer_map(c->pipe, c->vertex_buf.buffer, PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD_RANGE | PIPE_TRANSFER_DONTBLOCK, &buf_transfer); if (!vb) { // If buffer is still locked from last draw create a new one create_vertex_buffer(c); vb = pipe_buffer_map(c->pipe, c->vertex_buf.buffer, PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD_RANGE, &buf_transfer); } for (i = 0; i < VL_COMPOSITOR_MAX_LAYERS; i++) { if (s->used_layers & (1 << i)) { struct vl_compositor_layer *layer = &s->layers[i]; gen_rect_verts(vb, layer); vb += 20; if (!layer->viewport_valid) { layer->viewport.scale[0] = c->fb_state.width; layer->viewport.scale[1] = c->fb_state.height; layer->viewport.translate[0] = 0; layer->viewport.translate[1] = 0; } if (dirty && layer->clearing) { struct u_rect drawn = calc_drawn_area(s, layer); if ( dirty->x0 >= drawn.x0 && dirty->y0 >= drawn.y0 && dirty->x1 <= drawn.x1 && dirty->y1 <= drawn.y1) { // We clear the dirty area anyway, no need for clear_render_target dirty->x0 = dirty->y0 = MAX_DIRTY; dirty->x1 = dirty->y1 = MIN_DIRTY; } } } } pipe_buffer_unmap(c->pipe, buf_transfer); }
void init_gl(void) { glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); /*glViewport(0, 0, win_x, win_y);*/ perspective = mat4f_perspective(45.0f, (float)win_x / win_y, 0.5f, 1000.0f); orthographic = mat4f_orthographic(0.0f, win_x, win_y, 0.0f, -1.0f, 1.0f); create_vertex_buffer(); init_font(); main_program = compile_shaders("main.vert", "main.frag"); text_program = compile_shaders("text.vert", "text.frag"); iqm_program = compile_shaders("iqm.vert", "iqm.frag"); glUseProgram(main_program); /*initialize main shader variables*/ //~ printf("Map vertex attribute bound to %i\n", attribute_map_position); //~ printf("Map texcoords attribute bound to %i\n", attribute_map_texcoords); //~ printf("Map lightmap coords attribute bound to %i\n", attribute_map_texcoordsLM); glLinkProgram(main_program); /*Must link program before uniforms and after attributes?*/ gWorldLocation = glGetUniformLocation(main_program, "gWorld"); glUniform1i(glGetUniformLocation(main_program, "textureSampler"), /*GLTEXTURE*/0); glUniform1i(glGetUniformLocation(main_program, "lightmapSampler"), /*GLTEXTURE*/1); /*initialize text shader variables*/ /*Not sure if needed... glUseProgram(text_program);*/ glBindAttribLocation(text_program, 0, "coord"); glBindAttribLocation(text_program, 1, "texpos"); ortho_mat = glGetUniformLocation(text_program, "proj_mat"); uniform_color = glGetUniformLocation(text_program, "color"); uniform_alpha_scale = glGetUniformLocation(text_program, "alpha_mod"); glGenBuffers(1, &text_vbo); /*initialize iqm model shader variables*/ glUseProgram(iqm_program); //glLinkProgram(iqm_program); //glUniform1i(glGetUniformLocation(iqm_program, "iqm_sampler"), 0); }
int main() { srand(time(0)); for (int i = 0; i < 3; i++) gColor[i] = random_float(); signal(SIGINT, signal_handler); SDL_Init(SDL_INIT_VIDEO); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); /* Create our window centered at 512x512 resolution */ gWindow = SDL_CreateWindow("Hello Triangle", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN); SDL_GL_CreateContext(gWindow); SDL_GL_SetSwapInterval(1); /* create a black box context */ if (!bbgl_init(&bbgl)) { fprintf(stderr, "[bbgl] (client) failed to connect to black box\n"); return -1; } glViewport(0, 0, 800, 600); glClearColor(0.0f, 0.0f, 1.0f, 1.0f); //const char *vendor = (const char *)glGetString(GL_VENDOR); //const char *renderer = (const char *)glGetString(GL_RENDERER); //const char *version = (const char *)glGetString(GL_VERSION); //const char *shading = (const char *)glGetString(GL_SHADING_LANGUAGE_VERSION); //printf("vendor: %s\n", vendor); //printf("renderer: %s\n", renderer); //printf("version: %s\n", version); //printf("shading: %s\n", shading); create_vertex_array(); create_vertex_buffer(); compile_shaders(); int frames = 0; Uint32 start = SDL_GetTicks(); int dirs[3] = { +1, +1, +1 }; while (gRunning) { ++frames; Uint32 elapsed = SDL_GetTicks() - start; if (elapsed) { double seconds = elapsed / 1000.0; double fps = frames / seconds; printf("\r%g FPS\n", fps); } SDL_Event e; while (SDL_PollEvent(&e)) { switch (e.type) { case SDL_QUIT: gRunning = 0; break; } } render(); for (int i = 0; i < 3; i++) { int value = ((int)(gColor[i] * 255.0f)+dirs[i]); if (value > 255 || value <= 0) dirs[i] = -dirs[i]; gColor[i] = value/255.0f; } } bbgl_destroy(&bbgl); return 0; }