第一个OpenGL程序--画个三角形

一:main函数里进行初始化

int main(int argc,char* argv[])
{
    gltSetWorkingDirectory(argv[0]);
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
    glutInitWindowSize(800, 600);
    glutCreateWindow("Triangle");
   glutReshapeFunc(ChangeSize);//注册重塑函数
   glutDisplayFunc(RenderScene);//注册显示函数
    GLenum status = glewInit();
    if (GLEW_OK != status) {
        printf("GLEW Error:%s\n",glewGetErrorString(status));
        return 1;
    }
    SetupRC();
    glutMainLoop();
    return 0;
}

1:设置当前工作目录

gltSetWorkingDirectory(argv[0]);
只针对Mac OS 在Windows中是没必要的。因为windows下默认的工作目录就是与程序可执行目录相同。但是在Mac OS中工作目录被更改为应用程序捆绑中的/Resource文件夹。
glutInit(&argc, argv);

2:初始化GLUT库

glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
设置初始显示模式双缓冲窗口
参考 https://blog.csdn.net/augusdi/article/details/9329411
1: RGBA颜色模式--GLUT_RGBA:RGBA分别表示红绿蓝三色的分量,A(Alpha)表示颜色的透明度,通过设置RGB不同的比例,可以获得任意的颜色。
2:双缓存窗口 --GLUT_DOUBLE:是指绘图命令实际上是离屏缓存区执行的,然后迅速转换成窗口视图,这种方式,经常用来生成动画效果;
3:深度测试 --GLUT_DEPTH:标志将一个深度缓存区分配为显示的一部分,因此我们能够执行深度测试;
4:模板缓冲区 --GLUT_STENCIL:确保我们也会有一个可用的模板缓存区。

3:设置窗口信息

glutInitWindowSize(800, 600);
设置窗口的大小
glutCreateWindow("Triangle");
设置窗口的标题

4:初始化GLEW库,确保OpenGL API对程序完全可用。

GLenum status = glewInit();

5:设置渲染环境

setupRC();//这里写一些自己的代码

二:changeSize

void ChangeSize(int w,int h)
{
    glViewport(0,0, w, h);
}

x,y 参数代表窗口中视图的左下角坐标,而宽度、高度是像素为表示,通常x,y 都是为0。

三:RenderScene

void RenderScene(void)
{
    glClear(GL_COLOR_BUFFER_BIT |     GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
    GLfloat vRed[] = {1.0,1.0,0.0,0.0f};
    shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vRed);
    triangleBatch.Draw();
    glutSwapBuffers();
}

1: glClear 清除一个或者一组特定的缓存区。

 参数:指定将要清除的缓存的
 GL_COLOR_BUFFER_BIT :指示当前激活的用来进行颜色写入缓冲区
 GL_DEPTH_BUFFER_BIT :指示深度缓存区
 GL_STENCIL_BUFFER_BIT:指示模板缓冲区

2: shaderManager.UseStockShader

传递到存储着色器,即GLT_SHADER_IDENTITY着色器,这个着色器只是使用指定颜色以默认笛卡尔坐标在屏幕上渲染几何图形。

3: triangleBatch.Draw(); 提交着色器

4:glutSwapBuffers();

//在开始设置openGL 窗口的时候,我们指定要一个双缓冲区的渲染环境(GLUT_DOUBLE)。这就意味着将在后台缓冲区进行渲染,渲染结束后交换给前台。这种方式可以防止观察者看到可能伴随着动画帧与动画帧之间的闪烁的渲染过程。缓冲区交换平台将以平台特定的方式进行。
//将后台缓冲区进行渲染,然后结束后交换给前台

四:setupRC() 函数里绘制图形

//简单的批次容器,是GLTools的一个简单的容器类。

GLBatch triangleBatch;
void SetupRC()
{
    glClearColor(0.98f, 0.4f, 0.7f, 1);
    shaderManager.InitializeStockShaders();
    GLfloat vVerts[] = {
        -0.5f,0.0f,0.0f,
        0.5,0.0,0.0,
        0.0,0.5,0.0
    };
    triangleBatch.Begin(GL_TRIANGLES, 3);
    triangleBatch.CopyVertexData3f(vVerts);
    triangleBatch.End();
}

1: glClearColor 设置清屏颜色

2:shaderManager.InitializeStockShaders();

初始化一个渲染管理器。固定管线着色器

3: GLfloat vVerts[] 指定定点。

链接: https://pan.baidu.com/s/1rQelE2NwqEXfZwntG9FYNQ 提取码: jtxu

你可能感兴趣的:(第一个OpenGL程序--画个三角形)