在vs2013中如何实现opengl红宝书第八版的首个例子

网上有好多在vs2013中如何实现opengl红宝书第八版的首个例子的文章,但是自己尝试过后发现都多多少少有些问题。

首先去 http://www.opengl-redbook.com/ 下载红宝书的源代码,解压得到这个

将lib文件夹下的文件全部copy到vs2013安装目录的lib文件夹里

将include文件夹下的文件全部copy到vs2013安装目录的include文件夹里(注意里面有个GL文件夹,你自己的安装目录里如果配置过opengl也应该有GL文件夹)


接下来就可以在vs中新建项目了

新建一个cpp文件输入如下代码(课本上的)

#include <iostream>  
using namespace std;

#include "vgl.h"  
#include "LoadShaders.h"  
enum VAO_IDs { Triangles, NumVAOs };
enum Buffer_IDs { ArrayBuffer, NumBuffers };
enum Attrib_IDs { vPosition = 0 };
GLuint VAOs[NumVAOs];
GLuint Buffers[NumBuffers];
const GLuint NumVertices = 6;

void init(void)
{
	glGenVertexArrays(NumVAOs, VAOs);   
	glBindVertexArray(VAOs[Triangles]);
	GLfloat vertices[NumVertices][2] = {
		{ -0.90, -0.90 }, // Triangle 1  
		{ 0.85, -0.90 },
		{ -0.90, 0.85 },
		{ 0.90, -0.85 }, // Triangle 2  
		{ 0.90, 0.90 },
		{ -0.85, 0.90 }
	};
	glGenBuffers(NumBuffers, Buffers);
	glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]);
	glBufferData(GL_ARRAY_BUFFER, sizeof(vertices),
		vertices, GL_STATIC_DRAW);
	ShaderInfo shaders[] = {
		{ GL_VERTEX_SHADER, "triangles.vert" },
		{ GL_FRAGMENT_SHADER, "triangles.frag" },
		{ GL_NONE, NULL }
	};
	GLuint program = LoadShaders(shaders);
	glUseProgram(program);
	glVertexAttribPointer(vPosition, 2, GL_FLOAT,
		GL_FALSE, 0, BUFFER_OFFSET(0));
	glewExperimental = GL_TRUE;
	glEnableVertexAttribArray(vPosition);
}


void display(void)
{
	glClear(GL_COLOR_BUFFER_BIT);
	glBindVertexArray(VAOs[Triangles]);
	glDrawArrays(GL_TRIANGLES, 0, NumVertices);
	glFlush();
}

//---------------------------------------------------------------------  
 
int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGBA);
	glutInitWindowSize(512, 512);
	glutInitContextVersion(4, 3);
	glutInitContextProfile(GLUT_CORE_PROFILE);
	glutCreateWindow(argv[0]);
	if (glewInit()) {
		cerr << "Unable to initialize GLEW ... exiting" << endl;
		exit(EXIT_FAILURE);
	}<pre name="code" class="cpp">//
//
//  --- LoadShaders.cxx ---
//
//

#include <cstdlib>
#include <iostream>

#define GLEW_STATIC
#include <GL/glew.h>
#include "LoadShaders.h"

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus

	//----------------------------------------------------------------------------

	static const GLchar*
		ReadShader(const char* filename)
	{
#ifdef WIN32
			FILE* infile;
			fopen_s(&infile, filename, "rb");
#else
			FILE* infile = fopen(filename, "rb");
#endif // WIN32

			if (!infile) {
#ifdef _DEBUG
				std::cerr << "Unable to open file '" << filename << "'" << std::endl;
#endif /* DEBUG */
				return NULL;
			}

			fseek(infile, 0, SEEK_END);
			int len = ftell(infile);
			fseek(infile, 0, SEEK_SET);

			GLchar* source = new GLchar[len + 1];

			fread(source, 1, len, infile);
			fclose(infile);

			source[len] = 0;

			return const_cast<const GLchar*>(source);
		}

	//----------------------------------------------------------------------------

	GLuint
		LoadShaders(ShaderInfo* shaders)
	{
			if (shaders == NULL) { return 0; }

			GLuint program = glCreateProgram();

			ShaderInfo* entry = shaders;
			while (entry->type != GL_NONE) {
				GLuint shader = glCreateShader(entry->type);

				entry->shader = shader;

				const GLchar* source = ReadShader(entry->filename);
				if (source == NULL) {
					for (entry = shaders; entry->type != GL_NONE; ++entry) {
						glDeleteShader(entry->shader);
						entry->shader = 0;
					}

					return 0;
				}

				glShaderSource(shader, 1, &source, NULL);
				delete[] source;

				glCompileShader(shader);

				GLint compiled;
				glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
				if (!compiled) {
#ifdef _DEBUG
					GLsizei len;
					glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &len);

					GLchar* log = new GLchar[len + 1];
					glGetShaderInfoLog(shader, len, &len, log);
					std::cerr << "Shader compilation failed: " << log << std::endl;
					delete[] log;
#endif /* DEBUG */

					return 0;
				}

				glAttachShader(program, shader);

				++entry;
			}

#ifdef GL_VERSION_4_1
			if (GLEW_VERSION_4_1) {
				// glProgramParameteri( program, GL_PROGRAM_SEPARABLE, GL_TRUE );
			}
#endif /* GL_VERSION_4_1 */

			glLinkProgram(program);

			GLint linked;
			glGetProgramiv(program, GL_LINK_STATUS, &linked);
			if (!linked) {
#ifdef _DEBUG
				GLsizei len;
				glGetProgramiv(program, GL_INFO_LOG_LENGTH, &len);

				GLchar* log = new GLchar[len + 1];
				glGetProgramInfoLog(program, len, &len, log);
				std::cerr << "Shader linking failed: " << log << std::endl;
				delete[] log;
#endif /* DEBUG */

				for (entry = shaders; entry->type != GL_NONE; ++entry) {
					glDeleteShader(entry->shader);
					entry->shader = 0;
				}

				return 0;
			}

			return program;
		}

	//----------------------------------------------------------------------------
#ifdef __cplusplus
}
#endif // __cplusplus


init();glutDisplayFunc(display);glutMainLoop();}

 



这个时候一定要记得 再新建一个cpp文件复制LoadShaders.cpp(在上面解压到的文件夹中可以找到)内的内容,如下

//
//
//  --- LoadShaders.cxx ---
//
//

#include <cstdlib>
#include <iostream>

#define GLEW_STATIC
#include <GL/glew.h>
#include "LoadShaders.h"

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus

	//----------------------------------------------------------------------------

	static const GLchar*
		ReadShader(const char* filename)
	{
#ifdef WIN32
			FILE* infile;
			fopen_s(&infile, filename, "rb");
#else
			FILE* infile = fopen(filename, "rb");
#endif // WIN32

			if (!infile) {
#ifdef _DEBUG
				std::cerr << "Unable to open file '" << filename << "'" << std::endl;
#endif /* DEBUG */
				return NULL;
			}

			fseek(infile, 0, SEEK_END);
			int len = ftell(infile);
			fseek(infile, 0, SEEK_SET);

			GLchar* source = new GLchar[len + 1];

			fread(source, 1, len, infile);
			fclose(infile);

			source[len] = 0;

			return const_cast<const GLchar*>(source);
		}

	//----------------------------------------------------------------------------

	GLuint
		LoadShaders(ShaderInfo* shaders)
	{
			if (shaders == NULL) { return 0; }

			GLuint program = glCreateProgram();

			ShaderInfo* entry = shaders;
			while (entry->type != GL_NONE) {
				GLuint shader = glCreateShader(entry->type);

				entry->shader = shader;

				const GLchar* source = ReadShader(entry->filename);
				if (source == NULL) {
					for (entry = shaders; entry->type != GL_NONE; ++entry) {
						glDeleteShader(entry->shader);
						entry->shader = 0;
					}

					return 0;
				}

				glShaderSource(shader, 1, &source, NULL);
				delete[] source;

				glCompileShader(shader);

				GLint compiled;
				glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
				if (!compiled) {
#ifdef _DEBUG
					GLsizei len;
					glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &len);

					GLchar* log = new GLchar[len + 1];
					glGetShaderInfoLog(shader, len, &len, log);
					std::cerr << "Shader compilation failed: " << log << std::endl;
					delete[] log;
#endif /* DEBUG */

					return 0;
				}

				glAttachShader(program, shader);

				++entry;
			}

#ifdef GL_VERSION_4_1
			if (GLEW_VERSION_4_1) {
				// glProgramParameteri( program, GL_PROGRAM_SEPARABLE, GL_TRUE );
			}
#endif /* GL_VERSION_4_1 */

			glLinkProgram(program);

			GLint linked;
			glGetProgramiv(program, GL_LINK_STATUS, &linked);
			if (!linked) {
#ifdef _DEBUG
				GLsizei len;
				glGetProgramiv(program, GL_INFO_LOG_LENGTH, &len);

				GLchar* log = new GLchar[len + 1];
				glGetProgramInfoLog(program, len, &len, log);
				std::cerr << "Shader linking failed: " << log << std::endl;
				delete[] log;
#endif /* DEBUG */

				for (entry = shaders; entry->type != GL_NONE; ++entry) {
					glDeleteShader(entry->shader);
					entry->shader = 0;
				}

				return 0;
			}

			return program;
		}

	//----------------------------------------------------------------------------
#ifdef __cplusplus
}
#endif // __cplusplus

这个时候编译并运行,如果没有画出三角形,并且弹出如下信息:



这个时候可以改变这条语句:glutInitContextVersion(4, 3);把(4,3)改为(4,2)或者(3,1)等低版本,或者干脆注释掉。

这个时候已经可以运行了,单画出来的三角形是白色的,并不是蓝色的。。


终于到了最后一步了:

在你的工程目录下添加俩个文件,triangles.vert和triangles.frag, 用记事本新建就可,改好名字



triangles.vert内容如下:

#version 430 core  
layout(location = 0) in vec4 vPosition;  
void  
main()  
{  
    gl_Position = vPosition;  
}  
如果之前你出现过版本不支持4.3的问题,直接把第一句删除。


triangles.frag的内容:

#version 430 core  
out vec4 fColor;  
void  
main()  
{  
    fColor = vec4(0.0, 0.0, 1.0, 1.0);  
}  
同理 如果之前你出现过版本不支持4.3的问题,直接把第一句删除。


ok 大功告成了!!!







1. 用选择法对10个整数排序。10个整数用scanf函数输入。 (提示:所谓选择法就是先将10个数最小的数与a[0]对换;再将a[1]到a[9]最小的数与a[1]对换……每比较一轮,找出一个未经排序的数最小的一个。) 2. 有10个数存放在一个数组,输入一个数,要求用折半查找法找出该数是数组第几个元素的值。如果该数不在数组,则输出“无此数”。以10个数用赋初值的方法在程序给出。要找的数用scanf函数输入。 3. 找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点。 应当至少准备两组测试数据: ①二维数组有鞍点 9 80 205 40 90 -60 96 1 210 -3 101 89 ②二维数组没有鞍点 9 80 205 40 90 -60 196 1 210 -3 101 89 45 54 156 7 用scanf函数从键盘输入数组各元素的值,检查结果是否正确。题目并未指定 4. 写出一个判别素数的函数,在主函数输入一个整数,输出是否素数的信息。本程序应准备以下测试数据:17,34,2,1,0,1.8,-6分别输入数据,运行程序并检查结果是否正确。 5. 编写一个函数,由实参传过来一个字符串,统计此字符串字母、数字、空格和其它字符的个数,在主函数输入字符串以及输出上述的结果。 6. 用一个函数来实现将一行字符串最长的单词输出。 7. 自定义函数实现将一个十六进制数转换成十进制数(用main函数调用自定义函数实现功能)。 8. 写几个函数: (1) 输入10个职工的姓名和职工号; (2) 按职工号由小到大顺序排序,姓名顺序也随之调整; (3) 要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。 9. 以下函数p的功能是用递归方法计算x的n阶勒让德多项式的值;请编写p函数,在main函数调用自定义函数实现功能。递归公式如下: 10. 用递归法将一个整数n转换成字符串。例如:输入数483.应输出字符串“4 8 3”, 输入数-483.应输出字符串“- 4 8 3”。n的位数不确定,可以是任意的整数。 11. 给出年、月、日,计算该日是该年的第几天。(提示:注意闰年的情况。) 12. 有5个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号、姓名、3门课成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件stud。 设5名学生的学号、姓名和3门课成绩如下: 99101 Wang 89,98,67.5 99103 Li 60,80,90 99106 Fun 75.5,91.5,99 99110 Ling 100,50,62.5 99113 Yuan 58,68,7l 在向文件stud写入数据后,应检查验证stud文件的内容是否正确。 13. 将上题stud文件的学生数据,按平均分进行排序处理,将已排序的学生数据存入一个新文件stu_sort. 在向文件stu_sort写入数据后,应检查验证stu_sort文件的内容是否正确。 14. 对上题已排序的学生成绩文件进行插入处理,插入一个学生的3门课成绩。程序先计算新插入学生的平均成绩,然后将它按成绩高低顺序插入,插入后建立一个新文件。 要插入的学生数据为: 99108 Xin 90,95,60 在向新文件stu_new写入数据后,应检查验证stu_new文件的内容是否正确。 15. 对上题已排序的学生成绩文件进行删除处理,删除学号为“99106”的学生数据,并将修改后的文件信息保存到原文件stu_new。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值