OpenGL代码学习(5)--2D图形上下左右移动
注意:需要在配置好OpenGL的编程环境中运⾏下列代码,环境配置⽂章可参考:
下⾯的代码,直接放置在main.cpp⽂件中即可:
#pragma mark - 基本概念
/*
GLUT
全名OpenGL Uitility Tools,⼀种跨平台(Windows、Mac、Linux)的GUI编程框架,⽤于辅助OpenGL显⽰GUI界⾯。
GLEW
⼀种维护最好的开源OpenGL扩展加载库(⾃动初始化所有函数指针并包含所需类型定义、常量和枚举值),GLEW被预先封装在了GLTools库中。
GLTools
OpenGL快捷开发⼯具,包含⼀个⽤于操作矩阵和向量的3D数学库,⼀些产⽣和渲染简单的3D对象的函数,以及对视觉平截头体、相机类和变换矩阵进⾏管理的函数的充分⽀持。 OpenGL数据类型
为了OpenGL的移植性,OpenGL定义了各种数据类型,这些数据类型可以映射到所有平台上的特定最⼩格式。
*/
#pragma mark - 代码解析
#include <iostream>
#include "GLShaderManager.h"
#include "GLTools.h"
#include <glut/glut.h>
GLBatch squareBatch;
GLShaderManager shaderManager;
/// glew
// 构建四边形顶点数组,vVert包含4个顶点的(x,y,z)笛卡尔坐标
GLfloat blockSize = 0.2f;//半边长
GLfloat vVerts[12];
// 2 为程序做⼀次性的设置
void SetupRC() {
/// glew
// 设置背景颜⾊
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
/// include-GLShaderManager
// 初始化着⾊管理器
shaderManager.InitializeStockShaders();
GLfloat blockX = -blockSize;
GLfloat blockY = -blockSize;
// 左下⾓
vVerts[0] = blockX;
vVerts[1] = blockY;
vVerts[2] = 0.0f;
// 右下⾓
vVerts[3] = blockX + blockSize * 2;
vVerts[4] = blockY;
vVerts[5] = 0.0f;
/
/ 右上⾓
vVerts[6] = blockX + blockSize * 2;
vVerts[7] = blockY + blockSize * 2;
vVerts[8] = 0.0f;
// 左上⾓
vVerts[9] = blockX;
vVerts[10] = blockY + blockSize * 2;
vVerts[11] = 0.0f;
/// include-GLBatch
/*
GL_POINTS: 点
GL_LINES: 线
GL_LINE_STRIP: 条带线
GL_LINE_LOOP: 循环线
GL_TRIANGLES: 独⽴三⾓形
GL_TRIANGLE_STRIP: 三⾓形条带
GL_TRIANGLE_FAN: 三⾓形扇⾯
*/
// 开始构建批次,GL_TRIANGLE_FAN表⽰四边形,后⾯参数是顶点数
squareBatch.Begin(GL_TRIANGLE_FAN, 4);
glPointSize(9.f);
glLineWidth(5.f);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
/*
批次增加存储属性
CopyVertexData3f(XYZ顶点数据)
CopyNormalDataf(表⾯法线)
CopyColorData4f(RGBA颜⾊)
CopyTexCoordData2f(纹理坐标)
*/
// 批次增加存储属性,顶点数据
squareBatch.CopyVertexData3f(vVerts);
// 结束批次属性设置,表明完成数据复制操作,不能再添加新属性
squareBatch.End();
}
// 3 窗⼝⼤⼩改变时接受新的宽度和⾼度
void ChangeSize(int w, int h) {
/// glew
// 设置视⼝,(x, y, w, h),其中x,y代表窗⼝中视⼝的左下⾓坐标
glViewport(0, 0, w, h);
}
// 4 开始渲染
void RenderScene(void) {
/// glew
/
/ 清楚⼀个或⼀组特定的缓冲区
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
/// glew
// 设置⼀组浮点数表⽰红⾊
GLfloat vRed[] = {1.0f, 0.0f, 0.0f, 1.0f};
/// include-GLShaderManager
// 传递到存储着⾊器,即GLT_SHADER_IDENTITY着⾊器,这个着⾊器只是使⽤指定颜⾊以默认笛卡尔坐标系在屏幕上渲染⼏何图形 // 利⽤单位着⾊器设置矩形颜⾊为红⾊
shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed);
/// include-GLBatch
// 根据批次⾥的顶点数据利⽤当前设置的着⾊器进⾏画图
squareBatch.Draw();
/// GLUT
/*
当glutInitDisplayMode有传⼊双缓冲模式时,
将在后台缓冲区进⾏渲染,然后在结束时交换到前台
为了防⽌观察者看到可能随着动画帧和动画帧之间闪烁的渲染过程
*/
glutSwapBuffers();
}
void BourceFunction(int key) {
// 每次按键的矩形移动距离
GLfloat stepSize = 0.025f;
/
/ 左下⾓坐标的(x,y)
GLfloat blockX = vVerts[0];
GLfloat blockY = vVerts[1];
// 判断键盘点击的是哪个按钮,计算下⼀个点的位置
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 (blockY > (1.0f - blockSize * 2)) {
blockY = 1.0f - blockSize * 2;
}
if (blockY < -1.0f) {
blockY = -1.0f;
}
if (blockX < -1.0f) {
blockX = -1.0f;
}
if (blockX > (1.0f - blockSize * 2)) {
blockX = 1.0f - blockSize * 2;
float up}
// 设置下个位置的4个顶点坐标
// 左下⾓
vVerts[0] = blockX;
vVerts[1] = blockY;
/
/ 右下⾓
vVerts[3] = blockX + blockSize * 2;
vVerts[4] = blockY;
// 右上⾓
vVerts[6] = blockX + blockSize * 2;
vVerts[7] = blockY + blockSize * 2;
// 左上⾓
vVerts[9] = blockX;
vVerts[10] = blockY + blockSize * 2;
// 批次更新存储属性,顶点数据
squareBatch.CopyVertexData3f(vVerts);
}
/*
参数key表⽰按键的唯⼀标识,(x,y)是发⽣按键事件时⿏标点所处位置(以左上⾓为起点)
上下左右箭头按键分别对应的key值为:
GLUT_KEY_UP、GLUT_KEY_DOWN、GLUT_KEY_LEFT、GLUT_KEY_RIGHT
*/
void SpecialKeys(GLint key, GLint x, GLint y) {
///(⾃定义函数)
// 计算下⼀个矩形位置
BourceFunction(key);
/// GLUT
/
/ 触发重画事件 RenderScene
glutPostRedisplay();
}
// 1 程序⼊⼝
int main(int argc, char *argv[]) {
/// GLTools
// 设置当前⼯作⽬录,针对Mac OS X
gltSetWorkingDirectory(argv[0]);
/// GLUT
// 初始化GLUT库
glutInit(&argc, argv);
/
// GLUT
// 初始化渲染模式,其中标志GLUT_DOUBLE、GLUT_RGBA、GLUT_DEPTH、GLUT_STENCIL分别指双缓冲窗⼝、RGBA颜⾊模式、深度测试、模板缓冲区 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
/// GLUT
// 初始化窗⼝⼤⼩
glutInitWindowSize(800, 720);
/// GLUT
// 创建窗⼝
glutCreateWindow("Triangle");
/// GLUT
// 注册回调函数,拦截窗⼝⼤⼩变化消息,ChangeSize是⾃定义⽅法名
glutReshapeFunc(ChangeSize);
/// GLUT
// 注册回调函数,拦截窗⼝渲染消息,RenderScene是⾃定义⽅法名
glutDisplayFunc(RenderScene);
/// GLUT
/*
这⾥是键盘特殊按键点击回调注册(glutSpecialFunc)
GLUT语法中,特殊按键指功能键或者⽅向键(上下左右箭头键等)
它还有另⼀个键盘普通按键点击的回调注册(glutKeyboardFunc),⽐如空格键
*/
// 注册键盘特殊按键点击回调函数
glutSpecialFunc(SpecialKeys);
/// glew
// 确保驱动程序的初始化中没有出现任何问题
GLenum err = glewInit();
if (GLEW_OK != err) {
/// glew
fprintf(stderr, "glew erroe:%s\n", glewGetErrorString(err));
return1;
}
/// (⾃定义函数)
// 初始化设置
SetupRC();
/// GLUT
// 进⼊调⽤循环
glutMainLoop();
return0;
}
#pragma mark - 启动程序,调⽤函数的顺序
/*
1 主函数
int main(int argc, char *argv[])
2 为程序做⼀次性的设置
void SetupRC()
3 窗⼝⼤⼩改变时接受新的宽度和⾼度
void ChangeSize(int w, int h)
4 开始渲染
void RenderScene(void)
*/
#pragma mark - 拖动窗⼝,调⽤函数的顺序
/*
1 窗⼝⼤⼩改变时接受新的宽度和⾼度
void ChangeSize(int w, int h)
2 开始渲染
void RenderScene(void)
*/
#pragma mark - 键盘按动,调⽤函数的顺序
/*
1、void SpecialKeys(GLint key, GLint x, GLint y)
2、void BourceFunction(int key)
3、void RenderScene(void)
*/
#pragma mark - 全局变量的操作
/*
1 定义批次
GLBatch squareBatch;
2 属性设置
squareBatch.Begin(GL_TRIANGLES, 3);
squareBatch.CopyVertexData3f(vVerts);
squareBatch.End();
3 启⽤绘制功能
squareBatch.Draw();
4 顶点数据的更改
squareBatch.CopyVertexData3f(vVerts);
5 重新启⽤绘制功能
squareBatch.Draw();
*/
/*
1 定义着⾊管理器
GLShaderManager shaderManager;
2 初始化着⾊管理器
shaderManager.InitializeStockShaders();
3 使⽤着⾊管理器渲染
shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed); */
#pragma mark - 关键函数的理解
代码运⾏后的效果图如下图所⽰:
然后按键盘的上下左右⽅向键是可以移动中间的四边形的。
扩展:
1、如果想让图形⾃动移动,使⽤上下左右⽅向键控制⽅向
2、图形碰壁后⾃⼰⾃⼰调整⽅向后继续移动
等等,这样的需求,离不开【⾃动持续刷新】。下⾯的代码可供调试参考:
需求1的代码:
#pragma mark - 基本概念
/*
GLUT
全名OpenGL Uitility Tools,⼀种跨平台(Windows、Mac、Linux)的GUI编程框架,⽤于辅助OpenGL显⽰GUI界⾯。
GLEW
⼀种维护最好的开源OpenGL扩展加载库(⾃动初始化所有函数指针并包含所需类型定义、常量和枚举值),GLEW被预先封装在了GLTools库中。
GLTools
OpenGL快捷开发⼯具,包含⼀个⽤于操作矩阵和向量的3D数学库,⼀些产⽣和渲染简单的3D对象的函数,以及对视觉平截头体、相机类和变换矩阵进⾏管理的函数的充分⽀持。 OpenGL数据类型
为了OpenGL的移植性,OpenGL定义了各种数据类型,这些数据类型可以映射到所有平台上的特定最⼩格式。
*/
#pragma mark - 代码解析
#include <iostream>
#include "GLShaderManager.h"
#include "GLTools.h"
#include <glut/glut.h>
GLBatch squareBatch;
GLShaderManager shaderManager;
GLint specialkey = 0;
/// glew
// 构建四边形顶点数组,vVert包含4个顶点的(x,y,z)笛卡尔坐标
GLfloat blockSize = 0.2f;//半边长
GLfloat vVerts[12];
// 2 为程序做⼀次性的设置
void SetupRC() {
/// glew
// 设置背景颜⾊
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论