예제 #1
0
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;
}
예제 #3
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);
}
예제 #4
0
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);
}
예제 #5
0
파일: test.c 프로젝트: graphitemaster/bbgl
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;
}