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