前言
今天使用OpenGL的固定存储着色器渲染正方形,并能通过键盘移动。效果如下:
正方形绘制流程
代码实现:
//
// 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;
}