OpenGL环境搭建(VS2017 IDE)相关文章:https://blog.csdn.net/qq_39574690/article/details/114146097
#pragma comment(lib,"gltools.lib")
#include <GLTools.h>
#include <GLShaderManager.h>
#define FREEGLUT_STATIC
#include <gl/glut.h>
#include <gl/glew.h>
GLBatch squareBatch;
GLShaderManager shaderManager;
GLfloat blockSize = 0.1f;
GLfloat vVerts[] = { -blockSize, -blockSize, 0.0f,
blockSize, -blockSize, 0.0f,
blockSize, blockSize, 0.0f,
-blockSize, blockSize, 0.0f };
void SetupRC()
{
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
shaderManager.InitializeStockShaders();
squareBatch.Begin(GL_TRIANGLE_FAN, 4);
squareBatch.CopyVertexData3f(vVerts);
squareBatch.End();
}
//传递给glutSpecialFunc函数作为用户操作时触发的回调函数
//参数key是按键键码,x,y是鼠标位置
void SpecialKeys(int key, int x, int y)
{
GLfloat stepSize = 0.025f;
GLfloat blockX = vVerts[0]; //最小值X
GLfloat blockY = vVerts[7]; //最大值Y
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;
}
//约束范围在[-1,1] 即视口范围
if (blockX < -1.0f) blockX = -1.0f; //最小X值不能小于 -1.0最左边
if (blockX > (1.0f - blockSize * 2)) blockX = 1.0f - blockSize * 2; //最小X值不能大于 最右边1.0 - 自身Size(blockSize*2)
if (blockY < -1.0f + blockSize * 2) blockY = -1.0f + blockSize * 2; //最大Y值不能小于 最下边-1.0 + 自身Size
if (blockY > 1.0f) blockY = 1.0f; //最大Y值不能大于 最上边1.0
//重新赋值全局变量vVerts
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;
squareBatch.CopyVertexData3f(vVerts);
glutPostRedisplay();//将批次交给GPU渲染
}
void RenderScreen(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
GLfloat vRed[] = { 1.0f, 0.0f, 0.0f, 1.0f };
shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed);
squareBatch.Draw();
glutSwapBuffers();
}
void ChangeSize(int w, int h) {
glViewport(0, 0, w, h);
}
int main(int argc, char* argv[]) {
gltSetWorkingDirectory(argv[0]);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(800, 600);
glutCreateWindow("Move Block With Arrow Keys");
GLenum err = glewInit();
if (GLEW_OK != err) {
fprintf(stderr, "Error: %s\n", glewGetErrorString(err));
return 1;
}
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScreen);
glutSpecialFunc(SpecialKeys); //设置用户交互回调函数
SetupRC();
glutMainLoop();
return 0;
}