GLFW
首先下载并解压GLFW源码:https://www.glfw.org/
然后进入解压完成的目录下
sudo apt-get install cmake xorg-dev libglu1-mesa-dev
cmake ./
make
sudo make install
GLAD
下载地址:GLAD
然后直接
cd include
sudo mv * /usr/local/include
下载GLM数学库
下载地址:glm
复制其中的glm文件夹即可
cd glm-master
sudo cp -r glm/ /usr/local/include
下载Assimp图形库
git clone https://github.com/assimp/assimp.git
安装依赖:sudo apt-get install libgtest-dev
安装方式同glfw:
cmake ./
make
sudo make install
测试:
运行下列代码,看看是否出现一个三角形,这里用cmake编译(gload.c要放一起编译):
#include<glad/glad.h>
#include<GLFW/glfw3.h>
#include<iostream>
using namespace std;
//顶点着色器
const char* vertextShaderSource =
"#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n"
"void main(){\n"
" gl_Position = vec4(aPos.x,aPos.y,aPos.z,1.0);\n}";
//片段着色器
const char* fragmentShaderSource =
"#version 330 core\n"
"out vec4 FragColor;\n"
"void main(){\n"
" FragColor = vec4(1.0f,0.3f,0.6f,1.0f);"
"}\n";
//顶点数组
float vertices[]={
-0.5f,-0.5f,0.0f,
0.5f,-0.5f,0.0f,
0.0f,0.5f,0.0f
};
//用于编译shader
int CompileShader(const char* source,int type)
{
int shader=glCreateShader(type);
glShaderSource(shader,1,&source,nullptr);
glCompileShader(shader);
int ret=0;
char log[512]={0};
glGetShaderiv(shader,GL_COMPILE_STATUS,&ret);
if(!ret){
glGetShaderInfoLog(shader,512,nullptr,log);
cout<<log<<endl;
getchar();
return 0;
}
return shader;
};
int main()
{
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//设置主版本号
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//设置次版本号
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//使用核心模式
GLFWwindow* window = glfwCreateWindow(600,600,"test",nullptr, nullptr);
if(!window)
{
cout<<"创建窗口失败!"<<endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
if(!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){
cout<<"初始化GLAD失败!"<<endl;
return -1;
}
glViewport(0,0,600,600);
int vertextShader=CompileShader(vertextShaderSource,GL_VERTEX_SHADER);
if(!vertextShader) return -1;
int fragmentShader=CompileShader(fragmentShaderSource,GL_FRAGMENT_SHADER);
if(!fragmentShader) return -1;
//链接着色器程序
int shaderProgram=glCreateProgram();
glAttachShader(shaderProgram,vertextShader);
glAttachShader(shaderProgram,fragmentShader);
glLinkProgram(shaderProgram);
glDeleteShader(vertextShader);
glDeleteShader(fragmentShader);
GLuint VAO=0;
glGenVertexArrays(1,&VAO);
glBindVertexArray(VAO);
GLuint VBO=0;
glGenBuffers(1,&VBO);
glBindBuffer(GL_ARRAY_BUFFER,VBO);
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,3*sizeof(float),nullptr);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER,0);
glBindVertexArray(0);
while(!glfwWindowShouldClose(window))
{
if(glfwGetKey(window,GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window,true);
glClearColor(0.2f,0.3f,0.4f,0.8f);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(shaderProgram);
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES,0,3);
glfwSwapBuffers(window);
glfwPollEvents();
}
glDeleteVertexArrays(1,&VAO);
glDeleteBuffers(1,&VBO);
glfwTerminate();
return 0;
}
CMakeLists.txt(中间三个设置用于生成调试信息):
cmake_minimum_required(VERSION 3.10)
project(test)
add_executable(test test.cpp glad.c)
SET(CMAKE_BUILD_TYPE "Debug")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
target_link_libraries(test glfw3 GL m Xrandr Xi X11 Xxf86vm pthread dl Xinerama Xcursor)
运行结果