第一步下载glad以及glfw
点击下载glad
选择核心模式
版本选择3.3以上的
点击下载glfw
根据系统下载32位还是64位
两个包下载解压出来之后就是这个样子
打开VS新建一个空项目
右键项目名称打开属性
这里配置和平台选择所有配置 和所有平台 然后点击VC++目录 点击包含目录 打开之后选择编辑
点击这个文件夹菜单 要勾选从父级货项目默认设置继承
选择刚刚glfw文件夹里面的include文件夹 以及glad包里面的include文件夹
之后点击这个库目录选择glfw包里面lib文件夹 这里你VS是哪个版本就选哪个后缀这里我是2019所以我选择2019
之后点击链接器附加依赖项输入opengl32.lib(这里不管是你下载的64还是32后缀都是32) 以及glfw.lib
同时勾选父类继承
之后打开glad文件夹里面的src文件吧里面的glad源码复制到项目的源文件中就可以开始使用了
如果配置环境时候windows系统报错没找到 opengl32.lib 请检查电脑windowsSKD是否完整 或者是否勾选了父类继承
复制以下代码如果成功运行并且有图像输出说明环境配置成功了
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include<iostream>
using namespace std;
void processInput(GLFWwindow* window)//用这个函数来控制用户键盘输入
{
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
//这里我们检查用户是否按下了返回键(Esc)
}
float vertices[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};
const char* vertexShaderSource = "#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n"
"void main()\n"
"{\n"
" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
"}\0";
const char* fragmentShaderSource = "#version 330 core\n"
"out vec4 FragColor;\n"
"void main()\n"
"{\n"
" FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"
"}\n";
int main(void)
{
//必须先初始化该库,然后才能使用大多数GLFW函数。成功初始化后,GLFW_TRUE将返回。如果发生错误,GLFW_FALSE则返回。
if (!glfwInit())
return -1;
//创建窗口(OpenGL上下文似乎也一并创建了)
GLFWwindow* window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
//glfwCreateWindow函数需要窗口的宽和高作为它的前两个参数。第三个参数表示这个窗口的名称(标题
if (!window)
{
glfwTerminate();
return -1;
}
/* Make the window's context current */
glfwMakeContextCurrent(window);
//使用GLAD来加载OpenGL的函数地址 GLAD是用来管理OpenGL的函数指针的,所以在调用任何OpenGL的函数之前我们需要初始化GLAD。
//我们给GLAD传入了用来加载系统相关的OpenGL函数指针地址的函数。GLFW给我们的是glfwGetProcAddress,它根据我们编译的系统定义了正确的函数。
gladLoadGL();
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
unsigned int vertexShader;//创建一个对象vertexShader 以ID来索引所以使用 unsigned int型
vertexShader = glCreateShader(GL_VERTEX_SHADER);//glCreateShader来创建shader 以参数形式告诉函数GL_VERTEX_SHADER 顶点做色器
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);//下一步我们把这个着色器源码附加到着色器对象上,然后编译它:
glCompileShader(vertexShader);
/*
glShaderSource函数把要编译的着色器对象作为第一个参数。第二参数指定了传递的源码字符串数量,
这里只有一个。第三个参数是顶点着色器真正的源码,第四个参数我们先设置为NULL。
*/
unsigned int fragmentShader;
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);
/*
这个片段着色器和定点着色器一样
*/
//将源码编译之后需要把两个源码链接到一个程序里面
unsigned int shaderProgram;
shaderProgram = glCreateProgram();//使用这个glCreateProgram创建一个程序 返回ID的索引
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader); //把两个源码附加到程序上
glLinkProgram(shaderProgram);
glDeleteShader(vertexShader); //调用完成之后删除对象释放内存
glDeleteShader(fragmentShader);
/*
VBO顶点缓冲对象 作用为管理内存 用来管理在GPU上创建内存用于储存我们的顶点数据的内存
定义一个VBO变量 把变量传入glGenBuffers缓冲生成函数里面产生一个缓冲和一个ID
然后把这个缓冲对象用来管理GL_ARRAY_BUFFER
*/
unsigned int VAO,VBO;
glGenVertexArrays(1, &VAO);//glGenVertexArrays来创建顶点数组
glGenBuffers(1, &VBO);//glGenBuffers来创建缓存
glBindVertexArray(VAO);//为下面的属性绑定VAO
glBindBuffer(GL_ARRAY_BUFFER, VBO); //OpenGL有很多缓冲对象类型,顶点缓冲对象的缓冲类型是GL_ARRAY_BUFFER。
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);//绑定顶点并把顶点发送给GPU 第三个参数就是我们希望发送的实际数据。
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
//循环直到用户关闭窗口 渲染循环(Render Loop),它能在我们让GLFW退出前一直保持运行
while (!glfwWindowShouldClose(window))
{
processInput(window);//使用按键
//清理屏幕所用的颜色:
glClearColor(0.4f, 0.5f, 0.6f, 1.0f);
//清理屏幕 它接受一个缓冲位(Buffer Bit)来指定要清空的缓冲,
//可能的缓冲位有GL_COLOR_BUFFER_BIT,GL_DEPTH_BUFFER_BIT和GL_STENCIL_BUFFER_BIT。由于现在我们只关心颜色值,所以我们只清空颜色缓冲。
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(shaderProgram);//使用这个程序
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES, 0, 3);
//交换前后缓冲
glfwSwapBuffers(window);
//轮询并处理事件
glfwPollEvents();
}
glDeleteVertexArrays(1, &VAO);
glDeleteBuffers(1, &VBO);
glDeleteProgram(shaderProgram);
//使用GLFW完成操作后,通常是在应用程序退出之前,需要终止GLFW 释放/删除之前的分配的所有资源
glfwTerminate();
return 0;
}
之后我们需要使用吧stb_image.h来加载纹理直接添加头文件即可
资源下载
提取码:984h