OpenGL 正方形绘制&键位控制

前言

今天使用OpenGL的固定存储着色器渲染正方形,并能通过键盘移动。效果如下:


2020-07-08 17-31-27.2020-07-08 17_32_14.gif

正方形绘制流程

OpenGL 正方形绘制.png

代码实现:

//
//  main.cpp
//  OpenGLDemo
//
//  Created by SK on 2020/7/3.
//  Copyright © 2020 SK. All rights reserved.
//

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

//定义一个,着色管理器
GLShaderManager shaderManager;

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

// 边长
GLfloat blockSize = 0.2f;

// 正方形的4个点坐标
GLfloat vVerts[] = {
        -blockSize, -blockSize, 0.0f,
        blockSize, -blockSize, 0.0f,
        blockSize, blockSize, 0.0f,
        -blockSize, blockSize, 0.0f
};


GLfloat xPos = 0.0f;
GLfloat yPos = 0.0f;

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

void renderScene(void) {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    GLfloat vRed[] = {1.0f, 1.0f, 0.0f, 0.5f};
    
    M3DMatrix44f mFinalTransform, mTransfromMatrix, mRotationMartix;
    m3dTranslationMatrix44(mTransfromMatrix, xPos, yPos, 0.0f);
    
//    //每次平移时,旋转5度
//    static float yRot = 0.0f;
//    yRot += 5.0f;
//    m3dRotationMatrix44(mRotationMartix, m3dDegToRad(yRot), 0.0f, 0.0f, 1.0f);
//
//    //将旋转和移动的矩阵结果 合并到mFinalTransform (矩阵相乘)
//    m3dMatrixMultiply44(mFinalTransform, mTransfromMatrix, mRotationMartix);
    
    //将矩阵结果 提交给固定着色器(平面着色器)中绘制
    shaderManager.UseStockShader(GLT_SHADER_FLAT, mTransfromMatrix, vRed);
    triangleBatch.Draw();
    
    //执行交换缓存区
    glutSwapBuffers();
}

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;
    }
    
    //碰撞检测
    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;
    }
    
    glutPostRedisplay();
}

void setupRC() {
    glClearColor(0.98f, 0.40f, 0.7f, 1.0);
    shaderManager.InitializeStockShaders();
    
    triangleBatch.Begin(GL_TRIANGLE_FAN, 4);
    triangleBatch.CopyVertexData3f(vVerts);
    triangleBatch.End();
}

int main(int argc, char *argv[]) {
    /*
    `GLTools`函数`glSetWorkingDrectory`用来设置当前工作目录。实际上在Windows中是不必要的,因为工作目录默认就是与程序可执行执行程序相同的目录。但是在Mac OS X中,这个程序将当前工作文件夹改为应用程序捆绑包中的`/Resource`文件夹。`GLUT`的优先设定自动进行了这个中设置,但是这样中方法更加安全。
    */
    gltSetWorkingDirectory(argv[0]);
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
    glutInitWindowSize(800, 600);
    glutCreateWindow("OpenGL Demo");
    glutReshapeFunc(changeSize);
    glutDisplayFunc(renderScene);
    glutSpecialFunc(specialKeys);
    
    GLenum err = glewInit();
    if (err != GLEW_OK) {
        fprintf(stderr, "glew error: %s\n", glewGetErrorString(err));
        return 1;
    }
    setupRC();
    glutMainLoop();
    return 0;
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。