美文网首页
005 - OpenGL绘制三角形案例

005 - OpenGL绘制三角形案例

作者: A慢慢懂 | 来源:发表于2021-05-14 15:39 被阅读0次

    案例主要目的是绘制一个三角形,在蓝色背景下绘制一个红色的三角形

    三角形.png
    OpenGL在Mac Xcode的搭建:https://www.jianshu.com/p/0816f0be7870,还不知道的小伙伴可以看下

    1、导入头文件

    首先在编写程序之前,都会先将用到的函数和类定义的头文件包含进来

    #include "GLTools.h"
    #include "GLShaderManager.h"
    #include <GLUT/GLUT.h>
    

    GLTools.h头文件包含了GLTools中类似C语言的独立函数,而每个GLTools的C++类都有自己的头文件。
    GLShaderManager有GLTools着色器管理器类,没有着色器,我们就不能在OpenGL里面着色。
    GLUT/GLUT.h是在Mac上创建引用的,如果是在wins系统和Linux,则需要使用freeglut静态库,在他前面添加FREEGLUT_STATIC

    2、程序入口Main函数

    int main(int argc, char *argv[]){
        //设置当前工作目录
        gltSetWorkingDirectory(argv[0]);
        //初始化GLUT库
        glutInit(&argc, argv);
        //创建窗口使用那种类型的显示模式
        //双缓冲区/RGBA颜色模式/可用的模版缓冲区
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
        //窗口大小
        glutInitWindowSize(500, 500);
        //窗口标题
        glutCreateWindow("triangle");
        //
        glutReshapeFunc(changeSize);
        glutDisplayFunc(RenderScene);
        //检测程序初始化是否有问题
        GLenum err = glewInit();
        if (GLEW_OK != err) {
            fprintf(stderr, "GLEW error:%s\n",glewGetErrorString(err));
            return 1;
        }
        //渲染环境
        SetupRC();
        //主消息循环并结束main函数
        glutMainLoop();
        return 0;
    }
    

    3、定义视口

    void changeSize(int w,int h){
        //设置视口
        glViewport(0, 0, w, h);
    }
    

    glViewport修改从目的坐标系到屏幕坐标系上的映射

    void glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
    

    x,y代表窗口中视口的左下角坐标,高度和宽度是用像素表示的,一般情况下x,y是为0,视口一实际屏幕坐标定义了窗口中的区域,OpenGL可以在这个区域进行绘图,窗口越小,裁剪区域的渲染区域就越小。如下图

    200*300.png
    此时 glutInitWindowSize(200, 300);

    4、完成设置

    在开始main函数中的glut主循环之前,需要调用setupRC做一些设置

    void setupRC()
    {
     //设置清屏颜色
        glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
        //初始化着色器管理器
        shadermanager.InitializeStockShaders();
        //设置顶点数据
        GLfloat vVerts[] = {-0.5f,0.0f,0.0f,
                          0.5f,0.0f,0.0f,
                          -0.0f,0.5f,0.0f};
        triangleBatch.Begin(GL_TRIANGLES, 3);
        triangleBatch.CopyVertexData3f(vVerts);
        triangleBatch.End();
    }
    

    5、渲染

    void RenderScene(){
        //清除缓冲区
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
        
        GLfloat vRed[] = {1.0f,0.0f,0.0f,1.0f};
        //存储着色器,这个着色器只是使用指定颜色以默认笛卡尔坐标第在屏幕上渲染几何图形
        shadermanager.UseStockShader(GLT_SHADER_IDENTITY,vRed);
        
        triangleBatch.Draw();
        //渲染后台缓冲区,结束后交给前台
        glutSwapBuffers();
    }
    

    缓冲区有颜色缓冲区GL_COLOR_BUFFER_BIT、深度缓冲区GL_DEPTH_BUFFER_BIT和模版缓冲区GL_STENCIL_BUFFER_BIT,按BITWise位或操作来清除这三种缓冲区。
    设置浮点数来表示红色,将它传递到存储着色器GLT_SHADER_IDENTITY,这个着色器使用指定颜色以笛卡尔坐标系在屏幕上渲染几个图形。然后提交Draw到着色器,在渲染中,有个双缓冲区域来渲染环境,先在后台缓冲区进行渲染,然后在结束时交换到前台缓冲区,这样避免在观察者看到动画帧之间闪烁的渲染过程,缓冲区交换glutSwapBuffers,此时就完成了一个三角形的渲染。

    相关文章

      网友评论

          本文标题:005 - OpenGL绘制三角形案例

          本文链接:https://www.haomeiwen.com/subject/xosqjltx.html