【OpenGL】蓝宝书 2-2 Move 移动四边形 示例代码

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;		 
}

猜你喜欢

转载自blog.csdn.net/qq_39574690/article/details/114713566