美文网首页
OpenGL笔记整理(2)-绘制正方形并通过键位控制

OpenGL笔记整理(2)-绘制正方形并通过键位控制

作者: hamlyn | 来源:发表于2020-07-08 01:13 被阅读0次

关于用法OpenGL来绘制简单的图形并通过键位控制,我们可以需要用的步骤分为以下部分

  • 初始化GLUT库
  • 注册自定义回调函数实现进来实现
  • 渲染的初始化
  • 开启并进入消息循环

1. 初始化GLUT库

//设置当前工作目录,针对MAC OS X
gltSetWorkingDirectory(argv[0]);
//初始化GLUT库,这个函数只是传说命令参数并且初始化glut库
glutInit(&argc, argv);
//初始化GLUT库,传输命令参数 glutInit(&argc, argv); //初始化双缓冲窗口
//其中标志GLUT_DOUBLE(双缓冲窗口)、GLUT_RGBA(RGBA颜色模式)、GLUT_DEPTH(深度测试)、GLUT_STENCIL(模板缓冲区) glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL); 
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
 //GLUT窗口大小和标题 
glutInitWindowSize(800, 600); 
glutCreateWindow("Triangle");

2. 注册自定义回调函数

//注册窗口改变大小的回调函数
glutReshapeFunc(changeSize);
//注册显示函数
glutDisplayFunc(RenderScene);
//特殊键位函数
glutSpecialFunc(SpecialKeys);

glutReshapeFunc(changeSize)
窗口改变大小的回调函数,在第一次运行或者窗口被人为的变化时调用,可以设置程序的视口和投影方式

//在窗口大小改变时,接收新的宽度&高度。
void changeSize(int w,int h){
    //x,y 参数代表窗口中视图的左下角坐标,而宽度、高度是像素为表示,通常x,y 都是为0
    glViewport(0, 0, w, h);
}

glutDisplayFunc(RenderScene)
显示渲染函数,当屏幕发生变化/或者开发者主动渲染会调用此函数
由系统自动触发和开发者手动调用函数触发,有着清理缓存区(颜色,深度,模板缓存区等),使用存储着色器和绘制图形的功能

void RenderScene(void){
    void RenderScene(void){
    //清除缓存区
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
    //设置一组浮点数来表示红色
    GLfloat vRed[] = {1.0,0.0,0.0,1.0f};

   //使用存储着色器,即GLT_SHADER_IDENTITY着色器
    shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vRed);
    
    //提交着色器
    triangleBatch.Draw();
    
    //在开始的设置openGL,我们指定要一个双缓冲区的渲染环境。缓冲区交换平台将以平台特定的方式进行。
    //将后台缓冲区进行渲染,然后结束后交换给前台
    glutSwapBuffers();
}

glutSpecialFunc(SpecialKeys)
特殊键位函数,这里用来实现键盘键位控制正方形移动

void SpecialKeys(int key, int x, int y){
    
    GLfloat stepSize = 0.025f;
    if (key == GLUT_KEY_UP) {
        yPos += stepSize;
    }
    if (key == GLUT_KEY_DOWN) {
        yPos -= stepSize;
    }
    if (key == GLUT_KEY_LEFT) {
        xPos -= stepSize;
    }
    if (key == GLUT_KEY_RIGHT) {
        xPos += stepSize;
    }
    //边界值检测,这是触碰到边界(4个边界)的处理
    if (xPos < (-1.0f + blockSize)) {
        xPos = -1.0f + blockSize;
    }
    if (xPos > (1.0f - blockSize)) {
        xPos = 1.0f - blockSize;
    }
    if (yPos < (-1.0f + blockSize)) {
        yPos = -1.0f + blockSize;
    }
    if (yPos > (1.0f - blockSize)) {
        yPos = 1.0f - blockSize;
    }
    //这是触发重绘的一个API,类似于调用setNeedsDisplay()
    glutPostRedisplay();
}

3.渲染的初始化

设置清屏颜色,初始化着色器,设置图元装配方式并传输顶点数据给着色器

void setupRC()
{
    //设置清屏颜色(背景颜色)
    glClearColor(0.98f, 0.40f, 0.7f, 1);
   
    //没有着色器,在OpenGL 核心框架中是无法进行任何渲染的。初始化一个渲染管理器。
    shaderManager.InitializeStockShaders();
    
    //blockSize 边长
    GLfloat blockSize = 0.1f;

    //正方形的4个点坐标
    GLfloat vVerts[] = {
            -blockSize,-blockSize,0.0f,
            blockSize,-blockSize,0.0f,
            blockSize,blockSize,0.0f,
            -blockSize,blockSize,0.0f
    };
    
    //指定顶点修改为GL_TRIANGLE_FAN ,4个顶点
    triangleBatch.Begin(GL_TRIANGLE_FAN, 4);
    triangleBatch.CopyVertexData3f(vVerts);
    triangleBatch.End();
    
}

4.开启并进入消息循环

//runloop循环运行
glutMainLoop();

相关文章

网友评论

      本文标题:OpenGL笔记整理(2)-绘制正方形并通过键位控制

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