bilibili視頻鏈接:
【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p=5&vd_source=44b77bde056381262ee55e448b9b1973
一、知識點整理
1.1.OpenGL管線工作流程
- 為顯卡提供繪制的所有數據,并將數據存儲在GPU內存
- 使用著色器,即在GPU上執行的一種程序,來讀取數據并將其顯示在屏幕上
- 繪制圖形時使用頂點緩存,即GPU一塊內存。所以著色器開始讀取時,頂點緩存需要知道緩存層,它包含在緩存區,是一大堆浮點數,決定每個頂點的位置。
- 還要告訴OpenGL像坐標、紋理、法線等、以及在內存里面有什么,是如何布局的
1.2 Vertex
- Vertex不只是頂點
- 還可以包含一些定點相關的信息。顏色、紋理、坐標、法線等。
1.3?glVertexAttribPointer
1.3.1 c規范
1.3.2 功能
定義一個通用頂點屬性數據數組
1.3.3參數
index
指定要修改的通用頂點屬性的索引。
size
指定每個通用頂點屬性的組件數。必須是1、2、3、4。此外,符號常量GL_BGRA
?被glVertexAttribPointer
接受。初始值是4。
type
指定數組中每個組件的數據類型。符號常量GL_BYTE
、GL_UNSIGNED_BYTE
、GL_SHORT
、GL_UNSIGNED_SHORT
、GL_INT
和GL_UNSIGNED_INT
被glVertexAttribPointer
和glVertexAttribIPointer
接受。此外GL_HALF_FLOAT
、GL_FLOAT
、GL_DOUBLE
、GL_FIXED
、GL_INT_2_10_10_10_REV
、GL_UNSIGNED_INT_2_10_10_10_REV
和GL_UNSIGNED_INT_10F_11F_11F_REV
被glVertexAttribPointer
接受。GL_DOUBLE
也被glVertexAttribLPointer
接受,并且是該函數的type
參數中唯一被接受的令牌。初始值是GL_FLOAT
。
normalized
對于glVertexAttribPointer
,指定當固定點數據值被訪問時,是否應該進行歸一化 (GL_TRUE
) 或直接作為固定點值進行轉換 (GL_FALSE
)。
stride
指定連續的通用頂點屬性之間的字節偏移量。如果?stride
?為0,則通用頂點屬性在數組中被認為是緊密包裝的。初始值為0。
步幅。每個頂點之間的字節數量。一個頂點的多個字節被分配給多個屬性,如紋理、顏色等。
pointer
指定緩沖區中當前綁定到GL_ARRAY_BUFFER
目標的數據存儲中第一個通用頂點屬性數組的第一個組件的偏移量。初始值為0。?
1.3.4示例
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0);
1.4?glEnableVertexAttribArray
1.4.1 c規范
1.4.2 功能
啟用或禁用通用頂點屬性數組
1.4.3參數
-
vaobj
指定用于glDisableVertexArrayAttrib
和glEnableVertexArrayAttrib
函數的頂點數組對象名稱。
-
index
指定要啟用或禁用的通用頂點屬性的索引。
1.4.4示例
glEnableVertexAttribArray(0);
二、代碼
2.1 代碼
#include <GL/glew.h>
#include <GLFW/glfw3.h>#include<iostream>int main(void)
{GLFWwindow* window;//初始化glfwif (!glfwInit())return -1;//創建一個窗口模式的窗口并設置OpenGL上下文window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);if (!window)//如果窗口創建失敗,則終止程序{glfwTerminate();//釋放glfw資源return -1;}//設置當前窗口的上下文,之后所有的OpenGL調用都會在這個上下文中進行glfwMakeContextCurrent(window);//初始化GLEWif (glewInit() != GLEW_OK)std::cout << "Error!" << std::endl;//打印OpenGL版本信息std::cout << glGetString(GL_VERSION) << std::endl;//準備數據float position[6] = {0.0f, 0.5f,-0.5f, -0.5f,0.5f, -0.5f};unsigned int buffer;glGenBuffers(1, &buffer);glBindBuffer(GL_ARRAY_BUFFER, buffer);glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), position, GL_STATIC_DRAW);glEnableVertexAttribArray(0);glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0);//渲染循環,直到窗口被關閉while (!glfwWindowShouldClose(window)){//這部分主要:渲染窗口內容glClear(GL_COLOR_BUFFER_BIT);//刷新緩沖區并交換窗口glfwSwapBuffers(window);//處理窗口事件,如鍵盤輸入、鼠標移動等glfwPollEvents();}glfwTerminate();return 0;
}