《OpenGL超级宝典》读书笔记——第二章 入门指南

创建项目时的注意事项

    在visual studio 2013中创建项目时,需要项目的一些属性。

    在链接器-->输入-->附加依赖项中添加如下所示的信息。

    在链接器-->输入-->忽略特定默认库那里需要添加一下信息。

在C/C++-->预处理器-->预处理器定义需要添加如下信息。

一点零碎的小知识

1、GLShaderManager.h移入了GLTools着色器管理器(Shader)类。没有着色器,我们就不能在OpenGL(核心框架)中进行着色。

2、双缓冲窗口GLUT_DOUBLE

双缓冲窗口是指绘图命令实际上是在离屏缓冲区执行的,然后迅速换成窗口视图。

RGBA颜色模型GLUT_RGBA

GLUT_DEPTH位标志将一个深度缓冲区分配为一个显示的部分,因此我们能够执行深度测试。

GLUT_STENCIL确保我们会有一个可用的模板缓冲区。

3、在OpenGL中,某种颜色是由红、绿、蓝和Alpha(用于表示透明度)分量混合而成的。每种分量的值的范围均为从0.0到1.0。

4、glClrearColor的最后一个参数是alpha分量,它用来进行混合,并且可以产生一些特殊的效果,例如透明。//但是我目前还没有体会到。

一个代码例子

下面的代码实现了绘制一个矩形,并通过按键盘上的方向键来调整矩形的位置(renderscene),另一个函数中(RenderScene)则实现了一个自动的不停地在显示框内来回弹的效果。

具体代码如下所示:

#include<gltools.h>
#include<glshadermanager.h>
#define freeglut_static
#include<gl/glut.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();
}

//监听
void specialkeys(int key, int x, int y){
	GLfloat stepsize = 0.025f;

	GLfloat blockx = vverts[0];
	GLfloat blocky = vverts[7];

	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 (blockx < -1.0f)
		blockx = -1.0f;
	if (blockx>(1.0f - blocksize * 2))
		blockx = 1.0f - blocksize * 2;
	if (blocky < -1.0f + blocksize * 2)
		blocky = -1.0f + blocksize * 2;
	if (blocky>1.0f)
		blocky = 1.0f;

	//重新计算顶点位置
	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();
}

void renderscene(void){
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
	GLfloat vred[] = { 1.0f, 0.0f, 0.0f, 0.1f };
	shadermanager.UseStockShader(GLT_SHADER_IDENTITY, vred);
	squarebatch.Draw();

	glutSwapBuffers();
}

void BounceFunction(void)
{
	static GLfloat xDir = 1.0f;
	static GLfloat yDir = 1.0f;

	GLfloat stepSize = 0.005f;

	GLfloat blockX = vverts[0];   // Upper left X
	GLfloat blockY = vverts[7];  // Upper left Y

	blockY += stepSize * yDir;
	blockX += stepSize * xDir;

	// Collision detection
	if (blockX < -1.0f) { blockX = -1.0f; xDir *= -1.0f; }
	if (blockX >(1.0f - blocksize * 2)) { blockX = 1.0f - blocksize * 2; xDir *= -1.0f; }
	if (blockY < -1.0f + blocksize * 2)  { blockY = -1.0f + blocksize * 2; yDir *= -1.0f; }
	if (blockY > 1.0f) { blockY = 1.0f; yDir *= -1.0f; }

	// Recalculate vertex positions
	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);
}

void RenderScene(void){
	//用当前的颜色Clear the window
	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();

	BounceFunction();
	glutPostRedisplay();
}

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

int main(int argc, char* argv[]){
	gltSetWorkingDirectory(argv[0]);

	glutInit(&argc, argv);
	//双缓冲窗口		rgba颜色模式		深度缓冲区
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
	glutInitWindowSize(800, 600);
	glutCreateWindow("按方向键移动方块");

	GLenum err = glewInit();
	if (GLEW_OK != err){
		fprintf(stderr, "error: %s\n", glewGetErrorString(err));
		return 1;
	}

	glutReshapeFunc(changesize);
	glutDisplayFunc(RenderScene);
	//glutDisplayFunc(renderscene);
	glutSpecialFunc(specialkeys);

	setuprc();

	glutMainLoop();
	return 0;
}

运行截图如下所示:

感想体会

这一章的学习,对OpenGL程序有了一个简单的初认识。一开始的在visual studio中新建项目运行代码的时候,出了一些问题,比如说errorLNK2005 。这些问题花费了一些时间,结果问题是由项目属性的配置不合适导致的。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值