C++ OpenGL實(shí)現(xiàn)三角形的繪制
一、繪制三角形
1、初始化
(1)初始化GLFW
//初始化GLFW glfwInit();//初始化GLFW glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//設(shè)置主版本號(hào) glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//設(shè)置次版本號(hào) glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//設(shè)置核心模式 //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);//MAC OS glfwWindowHint(GLFW_RESIZABLE, false);//關(guān)閉可調(diào)節(jié)窗口大小
(2)創(chuàng)建一個(gè)窗口
//創(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)建一個(gè)視口
//創(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);//設(shè)置主版本號(hào) glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//設(shè)置次版本號(hào) glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//設(shè)置核心模式 //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);//MAC OS glfwWindowHint(GLFW_RESIZABLE, false);//關(guān)閉可調(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、頂點(diǎn)輸入
坐標(biāo)系規(guī)定
頂點(diǎn)坐標(biāo)代碼
//三角形的頂點(diǎn)數(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); //將頂點(diǎn)數(shù)據(jù)綁定至默認(rèn)的緩沖中 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)頂點(diǎn)屬性
//設(shè)置頂點(diǎn)屬性指針 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float),(void*)0); glEnableVertexAttribArray(0);
(3)解綁代碼
//設(shè)置完成之后就可以解綁VBO、VAO了 glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0);
4、頂點(diǎn)著色器和片段著色器
//頂點(diǎn)著色器源碼 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";
//生成并編譯著色器 //頂點(diǎn)著色器 int vertex_shader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL); glCompileShader(vertex_shader); int success; char info_log[512]; // 檢查著色器是否成功編譯,如果編譯失敗,打印錯(cuò)誤信息 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); // 檢查著色器是否成功編譯,如果編譯失敗,打印錯(cuò)誤信息 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; }
// 鏈接頂點(diǎn)和片段著色器至一個(gè)著色器程序 int shader_program = glCreateProgram(); glAttachShader(shader_program, vertex_shader); glAttachShader(shader_program, fragment_shader); glLinkProgram(shader_program); // 檢查著色器是否成功鏈接,如果鏈接失敗,打印錯(cuò)誤信息 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ā)事件(比如鍵盤(pán)輸入、鼠標(biāo)移動(dòng)等) 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; //三角形的頂點(diǎn)數(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);//設(shè)置主版本號(hào) glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//設(shè)置次版本號(hào) glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//設(shè)置核心模式 //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);//MAC OS glfwWindowHint(GLFW_RESIZABLE, false);//關(guān)閉可調(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); //將頂點(diǎn)數(shù)據(jù)綁定至默認(rèn)的緩沖中 glBufferData(GL_ARRAY_BUFFER, sizeof(triangle), triangle, GL_STATIC_DRAW); //生成并綁定VAO GLuint vertex_array_object; glGenVertexArrays(1, &vertex_array_object); glBindVertexArray(vertex_array_object); //設(shè)置頂點(diǎn)屬性指針 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);//參數(shù):頂點(diǎn)著色器位置值,分量,頂點(diǎn)數(shù)據(jù)類(lèi)型,是否標(biāo)準(zhǔn)化,步長(zhǎng)、數(shù)據(jù)偏移量 glEnableVertexAttribArray(0);//開(kāi)啟0通道 //設(shè)置完成之后就可以解綁VBO、VAO了 glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); //頂點(diǎn)著色器源碼 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"; //生成并編譯著色器 //頂點(diǎn)著色器 int vertex_shader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL); glCompileShader(vertex_shader); int success; char info_log[512]; // 檢查著色器是否成功編譯,如果編譯失敗,打印錯(cuò)誤信息 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); // 檢查著色器是否成功編譯,如果編譯失敗,打印錯(cuò)誤信息 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; } // 鏈接頂點(diǎn)和片段著色器至一個(gè)著色器程序 int shader_program = glCreateProgram(); glAttachShader(shader_program, vertex_shader); glAttachShader(shader_program, fragment_shader); glLinkProgram(shader_program); // 檢查著色器是否成功鏈接,如果鏈接失敗,打印錯(cuò)誤信息 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ā)事件(比如鍵盤(pán)輸入、鼠標(biāo)移動(dòng)等) glfwSwapBuffers(window); glfwPollEvents(); } // 刪除VAO和VBO glDeleteVertexArrays(1, &vertex_array_object); glDeleteBuffers(1, &vertex_buffer_object); // 清理所有的資源并正確退出程序 glfwTerminate(); return 0; }
輸出
修改尺寸
修改三角形顏色
修改背景顏色
線框模式
輸出
以上就是C++ OpenGL實(shí)現(xiàn)三角形的繪制的詳細(xì)內(nèi)容,更多關(guān)于C++ OpenGL繪制三角形的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之雙向循環(huán)鏈表的實(shí)例
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之雙向循環(huán)鏈表的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-06-06Vscode配置C/C++環(huán)境使用minGW(保姆級(jí)配置過(guò)程)
本文主要介紹了Vscode配置C/C++環(huán)境使用minGW(保姆級(jí)配置過(guò)程),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02Linux vmstat命令實(shí)戰(zhàn)詳細(xì)解析
這個(gè)命令是我查看Linux/Unix最喜愛(ài)的命令,一個(gè)是Linux/Unix都支持,二是相比top,我可以看到整個(gè)機(jī)器的CPU,內(nèi)存,IO的使用情況,而不是單單看到各個(gè)進(jìn)程的CPU使用率和內(nèi)存使用率(使用場(chǎng)景不一樣)2013-09-09C語(yǔ)言中關(guān)于scanf讀取緩存區(qū)的問(wèn)題
scanf()函數(shù)是通用終端格式化輸入函數(shù),它從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤(pán)) 讀取輸入的信息,接下來(lái)通過(guò)本文給大家介紹C語(yǔ)言中關(guān)于scanf讀取緩存區(qū)的問(wèn)題,需要的朋友一起看看吧2021-09-09