OpenGL学习笔记(2) 画一个正方形
生活随笔
收集整理的這篇文章主要介紹了
OpenGL学习笔记(2) 画一个正方形
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
畫一個正方形
其實,畫正方形就是畫兩個三角形,用四個頂點以及使用索引來實現
完整代碼在Square項目的Application.cpp里
先貼上窗口初始化代碼
畫一個普通的正方形
void NormalSquare() {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, // 左上};//索引unsigned int indices[] = {0,1,3,1,2,3};//編譯著色器Shader ourShader("vertex_1.vs", "fragment_1.fs");ourShader.use();//glUseProgram(shaderProgram);unsigned int VAO;//頂點數組glGenVertexArrays(1, &VAO);glBindVertexArray(VAO);//綁定頂點數組緩存unsigned int VBO;glGenBuffers(1, &VBO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);//綁定索引緩存unsigned int EBO;glGenBuffers(1, &EBO);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);// 位置屬性glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);while (!glfwWindowShouldClose(glWindow)){glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);//drawglBindVertexArray(VAO);glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);glBindVertexArray(0);glfwPollEvents();glfwSwapBuffers(glWindow);}glDeleteVertexArrays(1, &VAO);glDeleteBuffers(1, &VBO);glDeleteBuffers(1, &EBO);glfwTerminate(); }最終效果
畫一個彩色的正方形
和上一個筆記里畫彩色三角形的邏輯一樣,在頂點屬性后面加上顏色屬性,設置數據訪問指針的屬性,記得頂點著色器要加上顏色的輸入(步長和相位)
//彩色正方形 void ColourfulSquare() {float vertices[] = {// ---- 位置 ---- ---- 顏色 ---- 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, // 右上0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, // 右下-0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, // 左下-0.5f, 0.5f, 0.0f, 1.0f, 1.0f, 0.0f, // 左上};//索引unsigned int indices[] = {0,1,3,1,2,3};//編譯著色器Shader ourShader("vertex_4.vs", "fragment_4.fs");ourShader.use();//glUseProgram(shaderProgram);unsigned int VAO;//頂點數組glGenVertexArrays(1, &VAO);glBindVertexArray(VAO);//綁定頂點數組緩存unsigned int VBO;glGenBuffers(1, &VBO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);//綁定索引緩存unsigned int EBO;glGenBuffers(1, &EBO);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);// 位置屬性glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);// 顏色屬性glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float))); //最后一個參數是數據的起點glEnableVertexAttribArray(1);while (!glfwWindowShouldClose(glWindow)){glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);//drawglBindVertexArray(VAO);glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);glBindVertexArray(0);glfwPollEvents();glfwSwapBuffers(glWindow);}glDeleteVertexArrays(1, &VAO);glDeleteBuffers(1, &VBO);glDeleteBuffers(1, &EBO);glfwTerminate(); }最終效果
可以試試線框模式,在while之前加上
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
效果圖
轉載于:https://www.cnblogs.com/NightFrost/p/10792605.html
總結
以上是生活随笔為你收集整理的OpenGL学习笔记(2) 画一个正方形的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件测试2019:第一次作业
- 下一篇: POJ 1185 炮兵阵地 【状压DP】