WIN10+OpenGL+GLFW+GLEW+VS2017环境配置


OpenGL包含了一系列可以操作图形、图像的函数。然而,OpenGL本身并不是一个API(Application Programming Interface, 应用程序编程接口),它仅仅是一个由Khronos组织制定并维护的规范(Specification)。一般OpenGL的库是由你电脑显卡的显卡商提供开发和维护的。

GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入。
GLEW的目的是运行时获取函数地址并将其保存在一个函数指针中供程序使用。取得地址的方法因平台而异。

Note:在Windows系统中,opengl32.lib在Visual Studio安装的时候就默认安装了。

所需文件:

  • glew-2.1.0-win32.zip
  • glfw-3.2.1.bin.WIN32.zip

Note:一定都要下载32位的压缩包!

配置步骤

1. 新建项目

  • 打开VS2017,按照“文件->新建->项目->Visual C+±>空白项”新建一个“空白项”,更改项目名称为 “OpenGLTest00” ,更改项目位置,这里我的目录是D:\GAMESMAKESPACE\WORKSPACE\CPPCode
    然后点确认。
    WIN10+OpenGL+GLFW+GLEW+VS2017环境配置_第1张图片
  • 在新界面的右边的“方案资源管理器”处,选择“源文件”右键,然后依次点击“添加->新建项->Visual C+±>C++文件”,然后更改源文件的名称为"main.cpp" (这个就是我们写C++的cpp文件),左键确定。WIN10+OpenGL+GLFW+GLEW+VS2017环境配置_第2张图片

2. 配置路径

  • 在“解决方案管理器”中选择你的项目,右键,选择"属性",VS会生成下面的窗口
    这就是我们在项目中包含OpenGL和GLFW、GLEW的库的地方。

  • 点击“配置”的下拉框,选择“所有配置”,点击“平台”下拉框,选择“所有平台”;WIN10+OpenGL+GLFW+GLEW+VS2017环境配置_第3张图片

  • 选择 C/C++ ->常规 里的“附加包含目录”的编辑,在出来的对话框里添加路径 “ D:\GAMESMAKESPACE\OpenGL\glew-2.1.0-win32\glew-2.1.0\include”(红色部分的路径是我放GLEW的路径,这里改成你自己的路径就行)* 接着添加GLFW路径: "D:\GAMESMAKESPACE\OpenGL\glfw-3.2.1.bin.WIN32\include” ;WIN10+OpenGL+GLFW+GLEW+VS2017环境配置_第4张图片 然后点击确定。

  • 选择 链接器->常规 里的“附加库目录”的,点右边的下拉键,选择“编辑”,在出来的对话框里添加路径“ D:\GAMESMAKESPACE\OpenGL\glew-2.1.0-win32\glew-2.1.0\lib
    接着添加GLFW路径: "D:\GAMESMAKESPACE\OpenGL\glfw-3.2.1.bin.WIN32\lib-vc2015”;然后点击确定。 WIN10+OpenGL+GLFW+GLEW+VS2017环境配置_第5张图片

  • Note:这里的文件夹对应的是不同版本的编译器所需的库,这里我们用的是VS2017,选择 “lib-vc2015” 文件夹WIN10+OpenGL+GLFW+GLEW+VS2017环境配置_第6张图片

Visual Studio 各个版本与 VC 对应关系:

Visual Studio 6 : vc6
Visual Studio 2003 : vc7
Visual Studio 2005 : vc8
Visual Studio 2008 : vc9
Visual Studio 2010 : vc10
Visual Studio 2012 : vc11
Visual Studio 2013 : vc12
Visual Studio 2015 : vc14
Visual Studio 2017 : vc15
  • 最后添加动态库,选择 链接器->输入 ,点“附加依赖项”的编辑
    添加如下库:
opengl32.lib
glfw3.lib
glew32s.lib

WIN10+OpenGL+GLFW+GLEW+VS2017环境配置_第7张图片

测试

输入如下代码:

#define GLEW_STATIC
#include 
#include 
#include 
//#include 


void processInput(GLFWwindow* window);


//模型顶点数据
float vertices[] = {
	0.5f, 0.5f, 0.0f,   /* Postion 右上角  Color*/  1.0f, 0.0f, 0.0f,
	0.5f, -0.5f, 0.0f,  /* 右下角 */			    0.0f, 1.0f, 0.0f,
	-0.5f, -0.5f, 0.0f, /* 左下角 */			    0.0f, 0.0f, 1.0f,
	-0.5f, 0.5f, 0.0f,  /* 左上角*/					1.0f, 0.0f, 1.0f,
};


unsigned int indices[] = { // 注意索引从0开始! 
	0, 1, 3, // 第一个三角形
	1, 2, 3  // 第二个三角形
};

const char* vertexShaderSource =
"#version 330 core                                \n		"
"layout(location = 0) in vec3 aPos;              \n			"
"layout(location = 1) in vec3 aColor;              \n			"
"out vec4 vertexColor;                                      \n"
"void main(){\n												"
"		gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n	"
"		vertexColor = vec4(aColor.x,aColor.y,aColor.z,1.0);}\n					";

const char* fragmentShaderSource =
"#version 330 core                             \n	"
"in vec4 vertexColor; \n"
"out vec4 FragColor;                           \n	"
"void main(){\n										"
"		FragColor = vertexColor;}\n";

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


	glfwInit();
	//设置opengl版本3.3
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//告诉glfw主要版本3
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//告诉glfw次要版本3
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//告诉glfw使用core-profile

	GLFWwindow* window = glfwCreateWindow(800, 600, "Test window", NULL, NULL);

	if (window == NULL)
	{
		std::cout << "Failed to create GLFW window" << std::endl;
		glfwTerminate();//销毁窗口,释放资源
		//return EXIT_FAILURE;
	}
	glfwMakeContextCurrent(window);//指定线程

	glewExperimental = true;

	if (glewInit() != GLEW_OK)//初始glew工具
	{
		std::cout << "glew init failed." << std::endl;
		glfwTerminate();
		return EXIT_FAILURE;
	}
	//设置视口视角
	glViewport(0, 0, 800, 600);
	/*
	//框线模式 Wireframe Mode
	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
	//剔除多边形背面
	//glEnable(GL_CULL_FACE);
	//glCullFace(GL_FRONT);//GL_BACK:剔除背面 ,GL_FRONT:剔除正面
	*/
	//VAO 绑定Vertex Arrays
	unsigned int VAO;
	glGenVertexArrays(1, &VAO);
	glBindVertexArray(VAO);
	//VBO
	unsigned int VBO;
	glGenBuffers(1, &VBO);
	glBindBuffer(GL_ARRAY_BUFFER, VBO);
	glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

	//EBO
	unsigned int EBO;
	glGenBuffers(1, &EBO);

	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
	glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);


	//编译
	unsigned int vertexShader;
	vertexShader = glCreateShader(GL_VERTEX_SHADER);
	glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
	glCompileShader(vertexShader);

	unsigned int fragmentShader;
	fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
	glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
	glCompileShader(fragmentShader);
	//link 程序
	unsigned int shaderProgram;
	shaderProgram = glCreateProgram();
	glAttachShader(shaderProgram, vertexShader);
	glAttachShader(shaderProgram, fragmentShader);
	glLinkProgram(shaderProgram);


	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
	glEnableVertexAttribArray(0);
	glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float)));
	glEnableVertexAttribArray(1);

	while (!glfwWindowShouldClose(window))
	{
		//1.input
		//--------
		processInput(window);

		//2.render
		//--------
		//设置要填充的颜色(r 0-1.0,g 0-1.0,b 0-1.0,不透明度0-1.0)
		glClearColor(0.2f, 0.3f, 0.3f, 0.1f);
		//清空colorbuff的缓冲区
		glClear(GL_COLOR_BUFFER_BIT);
		//--------

		//Draw Triangle
		glBindVertexArray(VAO);
		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);

		glUseProgram(shaderProgram);
		//glDrawArrays(GL_TRIANGLES, 0, 6);

		glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

		//3.swap buffers and Poll IO events
		//-------
		glfwSwapBuffers(window);
		glfwPollEvents();

	}

	glfwTerminate();
	//std::cin.get();
	return 0;
}
//Esc按键响应程序
void processInput(GLFWwindow* window) {
	if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
	{
		glfwSetWindowShouldClose(window, true);
	}


}

如果出现下面的结果,就表示配置是成功的。
WIN10+OpenGL+GLFW+GLEW+VS2017环境配置_第8张图片

你可能感兴趣的:(OpenGL)