OpenGL 入门第一课 视窗以及三角形
生活随笔
收集整理的這篇文章主要介紹了
OpenGL 入门第一课 视窗以及三角形
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
請查看課件教程
下面是我粗劣畫的過程圖
下面是課件中的過程圖
下面是未使用索引緩沖對象(EBO)的
#define GLEW_STATIC // 這個(gè)一定要加不然報(bào)錯(cuò) 靜態(tài)鏈接庫 #include<iostream> #include<GL/glew.h> #include<GLFW/glfw3.h> using namespace std; void processInput(GLFWwindow); void processInput(GLFWwindow* window) {//如果鍵盤輸入esc 則觸發(fā) 退出if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {// 設(shè)置 要求退出glfwSetWindowShouldClose(window, true);} } // 逆時(shí)針方向繪制 默認(rèn)情況下,逆時(shí)針的頂點(diǎn)連接順序被定義為三角形的正 // 逆時(shí)針或順時(shí)針都是相對于觀察者方向的 float vertices[] = {-0.5f, 0.5f, 0.0f, // 左上角0.5f, -0.5f, 0.0f, // 右下角0.5f, 0.5f, 0.0f, // 右上角// 第二個(gè)三角形0.5f, -0.5f, 0.0f, // 右下角-0.5f, -0.5f, 0.0f, // 左下角-0.5f, 0.5f, 0.0f // 左上角 };const char* vertexShaderSource = "#version 330 core \n" "layout (location = 0) in vec3 aPos; \n" "void main() \n" "{ \n" " gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0); \n" "} \n"; const char* fragmentShaderSource = "#version 330 core \n" "out vec4 FragColor; \n" "void main() \n" "{ \n" " FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" "} \n";int main() {// 初始化GLFWglfwInit();// 提示 我們使用的版本是3.3// 主版本glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);// 次版本glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);// 簡介glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);// 創(chuàng)建一個(gè)窗口對象GLFWwindow* window = glfwCreateWindow(800, 600, "Test window", NULL, NULL);if (window == NULL) {cout << "open window failed." << endl;// 終止 glfwglfwTerminate();}// 綁定window到上下文對象 創(chuàng)建完窗口我們就可以通知GLFW將我們窗口的上下文設(shè)置為當(dāng)前線程的主上下文了glfwMakeContextCurrent(window);glewExperimental = true;// GLEW_OK 0//init GLEWif (glewInit() != GLEW_OK) {cout << "glew init failed." << endl;// 終止 glfwglfwTerminate();return -1;}// OpenGL渲染窗口的尺寸大小 // glViewport函數(shù)前兩個(gè)參數(shù)控制窗口左下角的位置。第三個(gè)和第四個(gè)參數(shù)控制渲染窗口的寬度和高度(像素)glViewport(0, 0, 800, 600);// 設(shè)置剔除 (opegl默認(rèn)正面背面都顯示(不剔除))glEnable(GL_CULL_FACE);// 剔除背面 GL_BACK 剔除正面 GL_FRONTglCullFace(GL_BACK);//VAO對象unsigned int VAO;// 生成一個(gè)VAO對象 這個(gè)方法可以生成多個(gè) 由第一個(gè)參數(shù)決定glGenVertexArrays(1, &VAO);// 綁定 VAOglBindVertexArray(VAO);unsigned int VBO; //如果多個(gè)可以用 VBO[]數(shù)組 這個(gè)方法可以生成多個(gè) 由第一個(gè)參數(shù)決定glGenBuffers(1, &VBO);//將新創(chuàng)建的緩沖綁定到 GL_ARRAY_BUFFER目標(biāo)上glBindBuffer(GL_ARRAY_BUFFER, VBO);// glBufferData 是一個(gè)專門用來把用戶定義的數(shù)據(jù)復(fù)制到當(dāng)前綁定緩沖的函數(shù)// GL_STATIC_DRAW 數(shù)據(jù)不會或幾乎不會改變。glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);// 編譯著色器unsigned int vertexShader;// 創(chuàng)建這個(gè)著色器vertexShader = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);// 編譯glCompileShader(vertexShader);// 片段著色器unsigned int fragmentShader;// 創(chuàng)建這個(gè)著色器fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);// 編譯glCompileShader(fragmentShader);// 著色器程序 是將多個(gè)著色器合并之后并最終鏈接完成的版本unsigned int shaderProgram;// 創(chuàng)建一個(gè)著色器程序?qū)ο?/span>shaderProgram = glCreateProgram();// 將之前編譯的著色器附加到程序?qū)ο笊?/span>glAttachShader(shaderProgram, vertexShader);glAttachShader(shaderProgram, fragmentShader);// 用glLinkProgram鏈接它們glLinkProgram(shaderProgram);// glVertexAttribPointer函數(shù)告訴OpenGL該如何解析頂點(diǎn)數(shù)據(jù)(應(yīng)用到逐個(gè)頂點(diǎn)屬性上)// 從 0位 開始 將數(shù)據(jù)每三個(gè)為一組 單位為float 每次跳3*float字節(jié) 偏移為0glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);// 以頂點(diǎn)屬性位置值作為參數(shù),啟用頂點(diǎn)屬性;頂點(diǎn)屬性默認(rèn)是禁用的glEnableVertexAttribArray(0);//渲染循環(huán) ,它能在我們讓GLFW退出前一直保持運(yùn)行。下面幾行的代碼就實(shí)現(xiàn)了一個(gè)簡單的渲染循環(huán)://glfwWindowShouldClose 我們每次循環(huán)的開始前檢查一次GLFW是否被要求退出while (!glfwWindowShouldClose(window)) {//自定義事件 當(dāng)鍵盤觸發(fā)esc 退出processInput(window);glClearColor(0.2, 0.3, 0.3, 1.0);// GL_COLOR_BUFFER_BIT 顏色,GL_DEPTH_BUFFER_BIT 深度 和 GL_STENCIL_BUFFER_BIT 模板// 清除前面的那一幀的顏色glClear(GL_COLOR_BUFFER_BIT);// 綁定 VAO glBindVertexArray(VAO);glUseProgram(shaderProgram);// 畫三角形 從0開始 繪制三個(gè)頂點(diǎn) 和VBO的頂點(diǎn)數(shù)據(jù)(通過VAO間接綁定)來繪制圖元glDrawArrays(GL_TRIANGLES, 0, 6);//解綁VAOglBindVertexArray(0);glfwSwapBuffers(window);glfwPollEvents();}// 最后終止 glfwglfwTerminate();return 0; }未剔除背面
剔除背面
使用EBO的
使用線框模式
加上下面那行代碼就變成線框模式了
glViewport(0, 0, 800, 600);// 設(shè)置剔除 (opegl默認(rèn)正面背面都顯示(不剔除))glEnable(GL_CULL_FACE);// 剔除背面 GL_BACK 剔除正面 GL_FRONTglCullFace(GL_BACK);// 線框模式 //第一個(gè)參數(shù)表示我們打算將其應(yīng)用到所有的三角形的正面和背面,第二個(gè)參數(shù)告訴我們用線來繪制glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);效果
判斷正背面
處理背面剔除有兩個(gè)需要參考的依據(jù),一個(gè)是正背面判斷,一個(gè)是觀察者位置
正背面判斷:在OpenGL中默認(rèn)是逆時(shí)針打點(diǎn)的為正面,順時(shí)針為側(cè)面。
總結(jié)
以上是生活随笔為你收集整理的OpenGL 入门第一课 视窗以及三角形的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于map对key自定义排序
- 下一篇: c++ for each 遍历tuple