C++ OpenGL實現(xiàn)三角形的繪制
更新時間:2022年06月24日 14:32:26 作者:代碼騎士
這篇文章主要主要為大家詳細介紹了如何利用C++和OpenGL實現(xiàn)三角形的繪制,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起動手嘗試一下
一、繪制三角形
1、初始化
(1)初始化GLFW
//初始化GLFW
glfwInit();//初始化GLFW
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//設置主版本號
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//設置次版本號
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//設置核心模式
//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);//MAC OS
glfwWindowHint(GLFW_RESIZABLE, false);//關閉可調(diào)節(jié)窗口大小
(2)創(chuàng)建一個窗口
//創(chuàng)建窗口(寬、高、窗口名)
auto window = glfwCreateWindow(screen_width, screen_hight, "Triangle", nullptr, nullptr);
if (window == nullptr) {
std::cout << "Failed to Create OpenGL Context" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
(3)初始化GLAD
//初始化GLAD
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
(4)創(chuàng)建一個視口
//創(chuàng)建視口
glViewport(0, 0, screen_width, screen_hight);
初始化代碼(全):
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
const int screen_width = 800;
const int screen_hight = 600;
int main() {
//初始化GLFW
glfwInit();//初始化GLFW
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//設置主版本號
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//設置次版本號
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//設置核心模式
//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);//MAC OS
glfwWindowHint(GLFW_RESIZABLE, false);//關閉可調(diào)節(jié)窗口大小
//創(chuàng)建窗口(寬、高、窗口名)
auto window = glfwCreateWindow(screen_width, screen_hight, "Triangle", nullptr, nullptr);
if (window == nullptr) {
std::cout << "Failed to Create OpenGL Context" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
//初始化GLAD
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
//創(chuàng)建視口
glViewport(0, 0, screen_width, screen_hight);
return 0;
}
2、頂點輸入
坐標系規(guī)定

頂點坐標代碼
//三角形的頂點數(shù)據(jù)
const float triangle[] = {
//--位置--//
-0.5f,-0.5f,0.0f,//左下
0.5f,-0.5f,0.0f,//右下
0.0f,0.5f,0.0f,//正上
};

3、數(shù)據(jù)處理
(1)VBO、VAO

//生成并綁定VBO
GLuint vertex_buffer_object;
glGenBuffers(1, &vertex_buffer_object);
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_object);
//將頂點數(shù)據(jù)綁定至默認的緩沖中
glBufferData(GL_ARRAY_BUFFER, sizeof(triangle), triangle, GL_STATIC_DRAW);

//生成并綁定VAO
GLuint vertex_array_object;
glGenVertexArrays(1, &vertex_array_object);
glBindVertexArray(vertex_array_object);

(2)頂點屬性
//設置頂點屬性指針
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float),(void*)0);
glEnableVertexAttribArray(0);
(3)解綁代碼
//設置完成之后就可以解綁VBO、VAO了
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
4、頂點著色器和片段著色器

//頂點著色器源碼
const char* vertex_shader_source =
"#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n"
"void main()\n"
"{\n"
" gl_Position = vec4(aPos,1.0);\n"
"}\n\0";

//片段著色器源碼
const char* fragment_shader_source =
"#version 330 core\n"
"out vec4 FragColor;\n"
"void main()\n"
"{\n"
" FragColor = vec4(1.0f,0.5f,0.2f,1.0f);\n"
"}\n\0";

//生成并編譯著色器
//頂點著色器
int vertex_shader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL);
glCompileShader(vertex_shader);
int success;
char info_log[512];
// 檢查著色器是否成功編譯,如果編譯失敗,打印錯誤信息
glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(vertex_shader, 512, NULL, info_log);
std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << info_log << std::endl;
}
// 片段著色器
int fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragment_shader, 1, &fragment_shader_source, NULL);
glCompileShader(fragment_shader);
// 檢查著色器是否成功編譯,如果編譯失敗,打印錯誤信息
glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(fragment_shader, 512, NULL, info_log);
std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << info_log << std::endl;
}

// 鏈接頂點和片段著色器至一個著色器程序
int shader_program = glCreateProgram();
glAttachShader(shader_program, vertex_shader);
glAttachShader(shader_program, fragment_shader);
glLinkProgram(shader_program);
// 檢查著色器是否成功鏈接,如果鏈接失敗,打印錯誤信息
glGetProgramiv(shader_program, GL_LINK_STATUS, &success);
if (!success) {
glGetProgramInfoLog(shader_program, 512, NULL, info_log);
std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << info_log << std::endl;
}
// 刪除著色器
glDeleteShader(vertex_shader);
glDeleteShader(fragment_shader);
// 線框模式
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
5、渲染

//渲染循環(huán)
while (!glfwWindowShouldClose(window)) {
// 清空顏色緩沖
glClearColor(0.0f, 0.34f, 0.57f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// 使用著色器程序
glUseProgram(shader_program);
// 繪制三角形
glBindVertexArray(vertex_array_object); // 綁定VAO
glDrawArrays(GL_TRIANGLES, 0, 3); // 繪制三角形
glBindVertexArray(0); // 解除綁定
// 交換緩沖并且檢查是否有觸發(fā)事件(比如鍵盤輸入、鼠標移動等)
glfwSwapBuffers(window);
glfwPollEvents();
}
// 刪除VAO和VBO
glDeleteVertexArrays(1, &vertex_array_object);
glDeleteBuffers(1, &vertex_buffer_object);二、完整代碼
代碼
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
const int screen_width = 800;
const int screen_hight = 600;
//三角形的頂點數(shù)據(jù)
const float triangle[] = {
//--位置--//
-0.5f,-0.5f,0.0f,//左下
0.5f,-0.5f,0.0f,//右下
0.0f,0.5f,0.0f,//正上
};
int main() {
//初始化GLFW
glfwInit();//初始化GLFW
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//設置主版本號
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//設置次版本號
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//設置核心模式
//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);//MAC OS
glfwWindowHint(GLFW_RESIZABLE, false);//關閉可調(diào)節(jié)窗口大小
//創(chuàng)建窗口(寬、高、窗口名)
auto window = glfwCreateWindow(screen_width, screen_hight, "Triangle", nullptr, nullptr);
if (window == nullptr) {
std::cout << "Failed to Create OpenGL Context" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
//初始化GLAD
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
//創(chuàng)建視口
glViewport(0, 0, screen_width, screen_hight);
//生成并綁定VBO
GLuint vertex_buffer_object;
glGenBuffers(1, &vertex_buffer_object);
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_object);
//將頂點數(shù)據(jù)綁定至默認的緩沖中
glBufferData(GL_ARRAY_BUFFER, sizeof(triangle), triangle, GL_STATIC_DRAW);
//生成并綁定VAO
GLuint vertex_array_object;
glGenVertexArrays(1, &vertex_array_object);
glBindVertexArray(vertex_array_object);
//設置頂點屬性指針
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);//參數(shù):頂點著色器位置值,分量,頂點數(shù)據(jù)類型,是否標準化,步長、數(shù)據(jù)偏移量
glEnableVertexAttribArray(0);//開啟0通道
//設置完成之后就可以解綁VBO、VAO了
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
//頂點著色器源碼
const char* vertex_shader_source =
"#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n"
"void main()\n"
"{\n"
" gl_Position = vec4(aPos,1.0);\n"
"}\n\0";
//片段著色器源碼
const char* fragment_shader_source =
"#version 330 core\n"
"out vec4 FragColor;\n"
"void main()\n"
"{\n"
" FragColor = vec4(1.0f,0.1f,0.1f,1.0f);\n"
"}\n\0";
//生成并編譯著色器
//頂點著色器
int vertex_shader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL);
glCompileShader(vertex_shader);
int success;
char info_log[512];
// 檢查著色器是否成功編譯,如果編譯失敗,打印錯誤信息
glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(vertex_shader, 512, NULL, info_log);
std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << info_log << std::endl;
}
// 片段著色器
int fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragment_shader, 1, &fragment_shader_source, NULL);
glCompileShader(fragment_shader);
// 檢查著色器是否成功編譯,如果編譯失敗,打印錯誤信息
glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(fragment_shader, 512, NULL, info_log);
std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << info_log << std::endl;
}
// 鏈接頂點和片段著色器至一個著色器程序
int shader_program = glCreateProgram();
glAttachShader(shader_program, vertex_shader);
glAttachShader(shader_program, fragment_shader);
glLinkProgram(shader_program);
// 檢查著色器是否成功鏈接,如果鏈接失敗,打印錯誤信息
glGetProgramiv(shader_program, GL_LINK_STATUS, &success);
if (!success) {
glGetProgramInfoLog(shader_program, 512, NULL, info_log);
std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << info_log << std::endl;
}
// 刪除著色器
glDeleteShader(vertex_shader);
glDeleteShader(fragment_shader);
// 線框模式
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
//渲染循環(huán)
while (!glfwWindowShouldClose(window)) {
// 清空顏色緩沖
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// 使用著色器程序
glUseProgram(shader_program);
// 繪制三角形
glBindVertexArray(vertex_array_object); // 綁定VAO
glDrawArrays(GL_TRIANGLES, 0, 3); // 繪制三角形
glBindVertexArray(0); // 解除綁定
// 交換緩沖并且檢查是否有觸發(fā)事件(比如鍵盤輸入、鼠標移動等)
glfwSwapBuffers(window);
glfwPollEvents();
}
// 刪除VAO和VBO
glDeleteVertexArrays(1, &vertex_array_object);
glDeleteBuffers(1, &vertex_buffer_object);
// 清理所有的資源并正確退出程序
glfwTerminate();
return 0;
}
輸出

修改尺寸

修改三角形顏色

修改背景顏色

線框模式

輸出

以上就是C++ OpenGL實現(xiàn)三角形的繪制的詳細內(nèi)容,更多關于C++ OpenGL繪制三角形的資料請關注腳本之家其它相關文章!
相關文章
C語言數(shù)據(jù)結構之雙向循環(huán)鏈表的實例
這篇文章主要介紹了C語言數(shù)據(jù)結構之雙向循環(huán)鏈表的實例的相關資料,需要的朋友可以參考下2017-06-06
Vscode配置C/C++環(huán)境使用minGW(保姆級配置過程)
本文主要介紹了Vscode配置C/C++環(huán)境使用minGW(保姆級配置過程),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02

