<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
(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);//關閉可調節視窗大小
(2)建立一個視窗
//建立視窗(寬、高、視窗名) 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)建立一個視口
//建立視口 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);//關閉可調節視窗大小 //建立視窗(寬、高、視窗名) 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; } //建立視口 glViewport(0, 0, screen_width, screen_hight); return 0; }
座標系規定
頂點座標程式碼
//三角形的頂點資料 const float triangle[] = { //--位置--// -0.5f,-0.5f,0.0f,//左下 0.5f,-0.5f,0.0f,//右下 0.0f,0.5f,0.0f,//正上 };
(1)VBO、VAO
//生成並繫結VBO GLuint vertex_buffer_object; glGenBuffers(1, &vertex_buffer_object); glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_object); //將頂點資料繫結至預設的緩衝中 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);
//頂點著色器原始碼 const char* vertex_shader_source = "#version 330 coren" "layout (location = 0) in vec3 aPos;n" "void main()n" "{n" " gl_Position = vec4(aPos,1.0);n" "}n ";
//片段著色器原始碼 const char* fragment_shader_source = "#version 330 coren" "out vec4 FragColor;n" "void main()n" "{n" " FragColor = vec4(1.0f,0.5f,0.2f,1.0f);n" "}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]; // 檢查著色器是否成功編譯,如果編譯失敗,列印錯誤資訊 glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(vertex_shader, 512, NULL, info_log); std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILEDn" << 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_FAILEDn" << 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_FAILEDn" << info_log << std::endl; } // 刪除著色器 glDeleteShader(vertex_shader); glDeleteShader(fragment_shader);
// 線框模式 //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
//渲染迴圈 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); // 解除繫結 // 交換緩衝並且檢查是否有觸發事件(比如鍵盤輸入、滑鼠移動等) 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; //三角形的頂點資料 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);//關閉可調節視窗大小 //建立視窗(寬、高、視窗名) 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; } //建立視口 glViewport(0, 0, screen_width, screen_hight); //生成並繫結VBO GLuint vertex_buffer_object; glGenBuffers(1, &vertex_buffer_object); glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_object); //將頂點資料繫結至預設的緩衝中 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);//引數:頂點著色器位置值,分量,頂點資料型別,是否標準化,步長、資料偏移量 glEnableVertexAttribArray(0);//開啟0通道 //設定完成之後就可以解綁VBO、VAO了 glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); //頂點著色器原始碼 const char* vertex_shader_source = "#version 330 coren" "layout (location = 0) in vec3 aPos;n" "void main()n" "{n" " gl_Position = vec4(aPos,1.0);n" "}n "; //片段著色器原始碼 const char* fragment_shader_source = "#version 330 coren" "out vec4 FragColor;n" "void main()n" "{n" " FragColor = vec4(1.0f,0.1f,0.1f,1.0f);n" "}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]; // 檢查著色器是否成功編譯,如果編譯失敗,列印錯誤資訊 glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(vertex_shader, 512, NULL, info_log); std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILEDn" << 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_FAILEDn" << 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_FAILEDn" << info_log << std::endl; } // 刪除著色器 glDeleteShader(vertex_shader); glDeleteShader(fragment_shader); // 線框模式 //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); //渲染迴圈 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); // 解除繫結 // 交換緩衝並且檢查是否有觸發事件(比如鍵盤輸入、滑鼠移動等) glfwSwapBuffers(window); glfwPollEvents(); } // 刪除VAO和VBO glDeleteVertexArrays(1, &vertex_array_object); glDeleteBuffers(1, &vertex_buffer_object); // 清理所有的資源並正確退出程式 glfwTerminate(); return 0; }
輸出
以上就是C++ OpenGL實現三角形的繪製的詳細內容,更多關於C++ OpenGL繪製三角形的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45