opengl 开发笔记-绘制图形(图元)

  • 定义数据类型
  • typedef struct{
        GLfloat x;  // x 坐标 
        GLfloat y;  // y 坐标
    } Vertex2F;
    
    typedef struct{
        GLfloat r;  // red (0~1) 
        GLfloat g;  // green
        GLfloat b;  // blue
        GLfloat a;  // alpha
    } Color4F;
    


  • 定义顶端数据
  • static Color4F red_color = {1.0f,0.0f,0.0f,1.0f};
    static Color4F green_color = {0.0f,1.0f,0.0f,1.0f};
    static Color4F blue_color = {0.0f,0.0f,1.0f,1.0f};
    
    static Vertex2F trangle_vertexes [3] =
    {
        {10,10},{100,10},{100,100}
    };
    
    static Vertex2F rect_vertexes [4] =
    {
        {20,200},{200,200},
        {20,300},{200,300}
    };
    
    static Vertex2F polygon_vertexes [6] =
    {
        {350,50},{450,120},
        {450,220},{350,300},
        {250,220},{250,120},
    };

  • 绘制三角形
  • void draw_trangle(){
        glEnableClientState(GL_VERTEX_ARRAY);
    
        glColor4f(red_color.r,red_color.g,red_color.b,red_color.a);
        glVertexPointer(sizeof(Vertex2F)/sizeof(GLfloat),GL_FLOAT,0,trangle_vertexes);
    
        glDrawArrays(GL_TRIANGLE_STRIP,0,3);
    }


  • 绘制矩形
  • void draw_rect(){
        glEnableClientState(GL_VERTEX_ARRAY);
    
        glColor4f(green_color.r,green_color.g,green_color.b,green_color.a);
        glVertexPointer(sizeof(Vertex2F)/sizeof(GLfloat),GL_FLOAT,0,rect_vertexes);
    
        glDrawArrays(GL_TRIANGLE_STRIP,0,4);
    }
    


  • 绘制任意多边形
  • void draw_polygon(){
        glEnableClientState(GL_VERTEX_ARRAY);
    
        glColor4f(blue_color.r,blue_color.g,blue_color.b,blue_color.a);
        glVertexPointer(sizeof(Vertex2F)/sizeof(GLfloat),GL_FLOAT,0,polygon_vertexes);
    
        glDrawArrays(GL_TRIANGLE_FAN,0,6);
    }
    


  • 统一坐标系(默认opengl的尺寸是整个窗口是坐标是x=0.5,y=0.5,width=1.0,height=1.0),经过下面的处理可以让窗口的大小和opengl里面的大小一致
  • void reshape(int width,int height){
        glViewport(0, 0, width, height);
    
        const float& fovy = 60;
        const float& zeye = height /(tan(fovy*M_PI_2/180)*2);
    
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(fovy, (GLfloat) width / height, 0.5f, 150000.0f);
    
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
    
        gluLookAt(width / 2, height / 2, zeye, width / 2, height / 2, 0, 0.0f, 1.0f,0.0f);
    }
    


  • 在display函数中调用
  • void display(){
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
        draw_trangle();
        draw_rect();
        draw_polygon();
    
        glutSwapBuffers();
        glutPostRedisplay();
    }


  • 生成程序
    g++ DrawShapes.cpp -lGLEW -lGL -lGLU -lglut -o DrawShapes
  • 运行效果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值