OpenGL 绘图移动

前言

在上一篇OpenGL 环境搭建基础上修改main.cpp文件,完成使用OpenGL图片绘制和移动效果。缓存

代码

详细代码已作注释:bash

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

//着色管理器
GLShaderManager shaderManager;

//批次容器
GLBatch quadsBatch;

//矩形坐标长度
GLfloat blockSize = 0.1f;

//顶点坐标
GLfloat vVerts[] = {
    -blockSize,-blockSize,0.0f,
    blockSize,-blockSize,0.0f,
    blockSize,blockSize,0.0f,
    -blockSize,blockSize,0.0f
};

//窗口大小修改回调
void changeSize(int w, int h) {
    glViewport(0, 0, w, h);
}

//区域渲染
void renderScene(void) {
    //清除一个缓存区
    glClear(GL_COLOR_BUFFER_BIT);
    
    GLfloat vBlue[] = {0.0,0.0,1.0,1.0f};
    //使用着色器渲染
    shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vBlue);
    quadsBatch.Draw();
    //后台缓冲区渲染完毕后交给前台显示
    glutSwapBuffers();
    
}

//初始化
void setupRC() {
    glClearColor(0.5f, 0.5f, 0.5f, 0.5f);
    shaderManager.InitializeStockShaders();
    quadsBatch.Begin(GL_QUADS, 4);
    quadsBatch.CopyVertexData3f(vVerts);
    quadsBatch.End();
}

//处理键盘控制图形移动
void specialKeys(int key, int x, int y) {
    
    GLfloat stepSize = 0.01f;
    
    GLfloat blockX = vVerts[0];
    GLfloat blockY = vVerts[10];
    
    if (key == GLUT_KEY_UP) {
        
        blockY += stepSize;
    }
    
    if (key == GLUT_KEY_DOWN) {
        
        blockY -= stepSize;
    }
    
    if (key == GLUT_KEY_LEFT) {
        blockX -= stepSize;
    }
    
    if (key == GLUT_KEY_RIGHT) {
        blockX += stepSize;
    }
    
    if (blockX < -1.0f) {
        blockX = -1.0f;
    }
    
    if (blockX > (1.0 - blockSize * 2)) {
        blockX = 1.0f - blockSize * 2;
    }
    
    if (blockY < -1.0f + blockSize * 2 ) {
        
        blockY = -1.0f + blockSize * 2;
    }
    
    if (blockY > 1.0f) {
        
        blockY = 1.0f;
        
    }
    
    //处理顶点
    vVerts[0] = blockX;
    vVerts[1] = blockY - blockSize*2;
    
    vVerts[3] = blockX + blockSize*2;
    vVerts[4] = blockY - blockSize*2;
    
    vVerts[6] = blockX + blockSize*2;
    vVerts[7] = blockY;
    
    vVerts[9] = blockX;
    vVerts[10] = blockY;
    
    quadsBatch.CopyVertexData3f(vVerts);
    glutPostRedisplay();
}


int main(int argc, char *argv[]) {
    //设置工做目录
    gltSetWorkingDirectory(argv[0]);
    //初始化glut库
    glutInit(&argc, argv);
    //初始化一个双缓冲区,离屏区渲染,窗口区显示
    glutInitDisplayMode(GLUT_DOUBLE);
    glutInitWindowSize(600, 600);
    glutCreateWindow("dowZhange");
    
    //注册重塑函数
    glutReshapeFunc(changeSize);
    //注册显示函数
    glutDisplayFunc(renderScene);
    
    glutSpecialFunc(specialKeys);
    
    //用于检查OpenGL API对程序可用
    GLenum status = glewInit();
    
    if (GLEW_OK != status) {
        return 1;
    }
    
    setupRC();
    glutMainLoop();
    
    return 0;
}

复制代码
相关文章
相关标签/搜索