在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
#include
#define freeglut_static
#include
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 。这些问题花费了一些时间,结果问题是由项目属性的配置不合适导致的。