Share&Joy

Ginger' Blog


  • 首页
  • 归档
  • 标签
  •   

© 2018 1-riverfish

Theme Typography by Makito

Proudly published with Hexo

Ubuntu下Clion配置、使用glfw,glad开发OpenGL项目

发布于 2018-10-27 Clion OpenGL CMake 

Ubuntu下Clion配置、使用glfw,glad开发OpenGL项目

本文主要解决以下问题:

  1. Ubuntu下glfw、glad、opengl等依赖库的安装
  2. Ubuntu下Clion OpenGL项目中CMakeLists.txt文件的配置

本学期计算机图形学要求使用OpenGL库,老师给的OpenGL教程中并没有说明Linux下使用Clion开发OpenGL项目的环境配置,而网上相关的教程很零散,所以答主在这里统一整理一下。

编译安装GLFW

  1. 查看是否安装CMake

    1
    2
    $ cmake -version
    cmake version 3.12.3

    如果没有安装,用以下命令安装

    1
    2
    $ sudo apt update
    $ sudo apt install cmake
  2. 去官网下载最新的GLFW

  3. 解压刚刚下载的文件,在同级目录下新建glfw-build文件夹,并切换目录到glfw-build中

  1. 在glfw-build目录下打开终端,输入下列命令

    1
    2
    3
    $ cmake ../glfw-3.2.1 # 这里换成你解压出来的glfw文件夹名
    $ make
    $ sudo make install
  2. 如果有类似这样的输出信息,即表示GLFW已配置好

1
2
3
4
5
6
7
8
9
10
11
Install the project...
-- Install configuration: ""
-- Up-to-date: /usr/local/include/GLFW
-- Up-to-date: /usr/local/include/GLFW/glfw3native.h
-- Up-to-date: /usr/local/include/GLFW/glfw3.h
-- Installing: /usr/local/lib/cmake/glfw3/glfw3Config.cmake
-- Installing: /usr/local/lib/cmake/glfw3/glfw3ConfigVersion.cmake
-- Installing: /usr/local/lib/cmake/glfw3/glfw3Targets.cmake
-- Installing: /usr/local/lib/cmake/glfw3/glfw3Targets-noconfig.cmake
-- Installing: /usr/local/lib/pkgconfig/glfw3.pc
-- Installing: /usr/local/lib/libglfw3.a

安装glad库

  1. 官网在线生成,选择好需要的版本和模式

点击页面最下方右下角的GENERATE按钮,在随后弹出的页面中,点击glad.zip进行下载

  1. 将压缩包中的include文件夹下的glad和KHR拷贝至/usr/local/include中

在Clion中创建项目

  1. 将glad压缩包src文件夹中的glad.c移动至新建项目目录中

  1. 修改CMakeLists.txt文件内容
1
2
3
4
5
6
7
8
9
cmake_minimum_required(VERSION 3.12)
project(YOUR_PROJECT_NAME)

set(CMAKE_CXX_STANDARD 14)

# 添加源文件
set(SOURCE_FILES main.cpp glad.c)
add_executable(YOUR_PROJECT_NAME ${SOURCE_FILES})
target_link_libraries(YOUR_PROJECT_NAME glfw3 GL m Xrandr Xi X11 Xxf86vm pthread dl Xinerama Xcursor)

测试

在新建项目main.cpp中写入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
#include <iostream>
#include <glad/glad.h>
#include <GLFW/glfw3.h>

using namespace std;

void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow *window);

// settings
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;

const GLchar *vertexShaderSource = "#version 330 core\n"
"layout (location = 0) in vec3 position;\n"
"layout (location = 1) in vec3 color;\n"
"out vec3 ourcolor;\n"
"void main()\n"
"{\n"
" gl_Position = vec4(position,1.0);\n"
" ourcolor = color;\n"
"}\0";

const GLchar *fragmentShaderSource = "#version 330 core\n"
"in vec3 ourcolor;\n"
"out vec4 color;\n"
"void main()\n"
"{\n"
" color = vec4(ourcolor,1.0f);\n"
"}\n\0";

int main() {
// glfw 初始化和配置
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,3);
glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE);

GLFWwindow* window = glfwCreateWindow(SCR_WIDTH,SCR_HEIGHT,"计算机图形学-homework1",NULL,NULL);
if(window == NULL){
cout<<"Failed to create glfw window"<<endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
glfwSetFramebufferSizeCallback(window,framebuffer_size_callback);

// 初始化GLAD load all opengl function pointers
if(!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){
cout<<"Failed to initialize GLAD"<<endl;
return -1;
}

// 构建编译着色器程序
// vertex shader
int vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader,1,&vertexShaderSource,NULL);
glCompileShader(vertexShader);
// 检查着色器编译是否正确
int success;
char infoLog[512];
glGetShaderiv(vertexShader,GL_COMPILE_STATUS,&success);
if(!success){
glGetShaderInfoLog(vertexShader,512,NULL,infoLog);
cout<<"ERROR::SHADER::VERTEX::COMPILATION_FAILED\n"<<infoLog<<endl;
}

// fragment shader
int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader,1,&fragmentShaderSource,NULL);
glCompileShader(fragmentShader);
//检查是否有编译错误
glGetShaderiv(fragmentShader,GL_COMPILE_STATUS,&success);
if(!success){
glGetShaderInfoLog(fragmentShader,512,NULL,infoLog);
cout<<"ERROE::SHADER::FRAGMENT::COMPILATION_FAILED\n"<<infoLog<<endl;
}
// link shaders
int shaderProgram = glCreateProgram();
glAttachShader(shaderProgram,vertexShader);
glAttachShader(shaderProgram,fragmentShader);
glLinkProgram(shaderProgram);
// 检查是否有链接错误
glGetProgramiv(shaderProgram,GL_LINK_STATUS,&success);
if(!success){
glGetProgramInfoLog(shaderProgram,512,NULL,infoLog);
cout<<"ERROR::SHADER::PROGRAM::LINKING_FAILED\n"<<infoLog<<endl;
}
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);

// 设置顶点数据(buffer)并且配置顶点属性
float vertices[] ={
// Positions // Colors
0.0f,-0.5f,0.0f, 1.0f,0.0f,0.0f, // 1 Bottom Right
-0.5f,-0.5f,0.0f, 1.0f,0.0f,0.0f, // 1 Bottom Left
0.0f,0.0f,0.0f, 1.0f,0.0f,0.0f, // 1 Top Right
-0.5f,0.0f,0.0f, 1.0f,0.0f,0.0f, // 1 Top Left
0.0f,0.0f,0.0f, 0.0f,0.0f,1.0f, // 2 Bottom Right
-0.5f,0.0f,0.0f, 0.0f,0.0f,1.0f, // 2 Bottom Left
0.3f,0.3f,0.0f, 0.0f,0.0f,1.0f, // 2 Top Right
-0.2f,0.3f,0.0f, 0.0f,0.0f,1.0f, // 2 Top Left
0.3f,-0.2f,0.0f, 0.0f,1.0f,0.0f, // 3 Bottom Right
0.0f,-0.5f,0.0f, 0.0f,1.0f,0.0f, // 3 Bottom Left
0.3f,0.3f,0.0f, 0.0f,1.0f,0.0f, // 3 Top Right
0.0f,0.0f,0.0f, 0.0f,1.0f,0.0f // 3 Top Left
};

// 绘制矩形的顺序
unsigned int indices[] = { // note that we start from 0!
0, 1, 3, // 1 Triangle
0, 2, 3, // 2 Triangle
4, 5, 7, // 3 Triangle
4, 6, 7, // 4 Triangle
8, 9, 11, // 5 Triangle
8, 10, 11 // 6 Triangle
};

unsigned int VBO,VAO,EBO;
glGenVertexArrays(1,&VAO);
glGenBuffers(1,&VBO);
glGenBuffers(1,&EBO);
// 首先绑定VAO对象 再绑定VBO对象 然后配置顶点属性
glBindVertexArray(VAO);

glBindBuffer(GL_ARRAY_BUFFER,VBO);
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);

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

// 配置顶点属性 0
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,6*sizeof(float),(GLvoid*)0);
glEnableVertexAttribArray(0);
// 配置顶点属性 1
glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,6*sizeof(float),(GLvoid*)(3 * sizeof(GLfloat)));
glEnableVertexAttribArray(1);

// unbind VBO
glBindBuffer(GL_ARRAY_BUFFER,0);
// unbind VAO
glBindVertexArray(0);


// render loop
while(!glfwWindowShouldClose(window)){
// 输入
processInput(window);

// 渲染指令
glClearColor(0.2f,0.3f,0.3f,1.0f);
glClear(GL_COLOR_BUFFER_BIT);

// 画出一个三角形
glUseProgram(shaderProgram);
glBindVertexArray(VAO);
//glDrawArrays(GL_TRIANGLES,0,6);
glDrawElements(GL_TRIANGLES,18,GL_UNSIGNED_INT,0);
// 检查并调用事件 交换缓冲
glfwSwapBuffers(window);
glfwPollEvents();
}

// 释放资源
glDeleteVertexArrays(1,&VAO);
glDeleteBuffers(1,&VBO);
glDeleteBuffers(1,&EBO);

// glfw terminate
glfwTerminate();
return 0;
}

// 处理键盘输入
void processInput(GLFWwindow *window)
{
if(glfwGetKey(window,GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window,true);
}

// glfw: whenever the window size changed (by OS or user resize) this callback function executes
void framebuffer_size_callback(GLFWwindow* window,int width,int height)
{
glViewport(0,0,width,height);
}

成功运行!

注:

  1. Ubuntu下默认已安装OpenGL库,如未安装可自行安装
  2. Clion中CMakeLists.txt文件配置使用教程

如有问题请联系QQ:1020072294

分享到 

 上一篇: Linux终端代理设置 下一篇: Node入门-1 

© 2018 1-riverfish

Theme Typography by Makito

Proudly published with Hexo