OpenGL包含了一系列可以操作图形、图像的函数。然而,OpenGL本身并不是一个API(Application Programming Interface, 应用程序编程接口),它仅仅是一个由Khronos组织制定并维护的规范(Specification)。一般OpenGL的库是由你电脑显卡的显卡商提供开发和维护的。
GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入。
GLEW的目的是运行时获取函数地址并将其保存在一个函数指针中供程序使用。取得地址的方法因平台而异。
Note:在Windows系统中,opengl32.lib在Visual Studio安装的时候就默认安装了。
Note:一定都要下载32位的压缩包!
在“解决方案管理器”中选择你的项目,右键,选择"属性",VS会生成下面的窗口
这就是我们在项目中包含OpenGL和GLFW、GLEW的库的地方。
选择 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” ; 然后点击确定。
选择 链接器->常规 里的“附加库目录”的,点右边的下拉键,选择“编辑”,在出来的对话框里添加路径“ 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”;然后点击确定。
Note:这里的文件夹对应的是不同版本的编译器所需的库,这里我们用的是VS2017,选择 “lib-vc2015” 文件夹
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
输入如下代码:
#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);
}
}