OpenGL入門(四)頂點緩衝區

2021-08-28 23:39:29 字數 2174 閱讀 3820

寫在前面

最近對opengl程式設計又雙叒產生了濃厚的興趣,決定把學習opengl過程中學到的知識都整理到部落格中來,一來方便日後檢視,而來也是為了和諸位大佬共勉。有不當的地方還望諸位批評指正,謝謝。 

本系列部落格將使用freeglut3.0.0和glew2.1.0和vs2017,在win10平台上開發。

// opengl4.cpp: 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include

#include

#pragma comment(linker, "/subsystem:\"windows\" /entry:\"maincrtstartup\"")

glfloat vertex = ;

gluint vbo;

void init()

void display()

int main(int argc, char ** argv)

init();

glutdisplayfunc(display);

glutmainloop();

return 0;

}glgenbuffers(glsizei n, gluint* buffers);

1分配n個緩衝區物件識別符號,返回的識別符號儲存在buffers陣列中。每乙個識別符號表示乙個已經開始使用的緩衝區物件。具體如何分配有opengl內部決定,與呼叫者無關。此外,該方法呼叫之後在buffers中儲存的識別符號並不一定是連續的數字,而且0作為乙個被保留的緩衝區物件名稱,該方法從來不會返回0識別符號。

glbindbuffer(glenum target, gluint buffer);

1繫結緩衝區物件。buffer是glgenbuffers()返回的識別符號陣列的乙個值,target表示改緩衝區應該繫結為什麼型別的緩衝區物件,有gl_array_buffer(頂點陣列緩衝區)、gl_element_array_buffer(索引陣列緩衝區)等。需要注意的是(以gl_array_buffer為例):

如果buffer為0,則停用頂點陣列緩衝區;

如果buffer為非零整數,且buffer代表的緩衝區之前未繫結過,則建立乙個新的緩衝區物件和buffer相對應;

如果buffer之前繫結過,則啟用buffer對應的緩衝區。

glbufferdata(glenum target, glsizeiptr size, const void* data, glenum usage);

1初始化緩衝區物件,並指定緩衝區資料。target和glbindbuffer()中的target一樣,data表示要寫入到緩衝區的資料陣列頭指標,size表示data陣列的位元組數,usage表示資料在分配到緩衝區之後如何如何進行讀取和寫入,主要用來提供效能,其值為「gl_頻率_操作」格式,有gl_stream_draw、gl_stream_read、gl_stream_copy、gl_static_*、gl_dynamic_*。其中,「頻率」指緩衝區資料的讀取或者渲染速率,有流模式、靜態模式,動態模式:

stream:流模式,當緩衝區中的資料更新頻率高,但使用頻率低時使用;

static:靜態模式,當緩衝區中的資料只需制定一次,但使用頻率比較高時使用;

dynamic:動態模式,當緩衝區中的資料更新頻率高,並且使用頻率高時使用。 

「操作」有繪製 、讀取和拷貝。

draw:繪製,緩衝區中的資料直接用於渲染,也就是記憶體中的資料直接作為渲染資料;

read:讀取,緩衝區中的資料主要用於應用程式的計算,而不是直接作用於渲染;

copy:拷貝,緩衝區中的資料對渲染來說是唯讀資料,需要拷貝後將拷貝資料作為渲染資料。 

關於usage我們後面還會遇到,慢慢深入了解。

glbuffersubdata(glenum target, glintptr offset, glsizeiptr size, const void* data);

1更新緩衝區中的資料。target和之前兩個方法的引數一樣,data指寫入緩衝區的資料所在陣列頭指標,size指data陣列中要寫入緩衝區的資料的位元組數,offset指要寫入緩衝區的第乙個資料在data陣列的 

位置。也即將data陣列中從offset(位元組為單位)開始的size個位元組寫入緩衝區。

gldeletebuffers(glsizei n, const gluint* buffers);

1刪除buffers中前n個緩衝區物件,他們的名稱就是buffers陣列中的元素。

OpenGL入門(四)頂點緩衝區

最近對opengl程式設計又雙叒產生了濃厚的興趣,決定把學習opengl過程中學到的知識都整理到部落格中來,一來方便日後檢視,而來也是為了和諸位大佬共勉。有不當的地方還望諸位批評指正,謝謝。本系列部落格將使用freeglut3.0.0和glew2.1.0和vs2017,在win10平台上開發。ope...

Unity Shader (四)頂點程式示例

1 在頂點函式中實現凸起效果 2 漸變及溜光效果 3 頂點扭曲效果 旋轉矩陣去影響頂點 優化繞y軸旋轉的矩陣,除去0與其他項相乘的項 float x cos angle v.vertex.x sin angle v.vertex.z float z sin angle v.vertex.x cos ...

opengl 教程 9 頂點屬性插值

本章我們了解3d管線的乙個重要特性,在光柵化階段的頂點屬性插值。從前面的教程我們知道,為了在螢幕上輸出渲染的物體,我們在頂點shader中輸出gl position,這是乙個四維向量,表示齊次空間的頂點座標,x,y,z都經過了透視除法,除以了w值,x y的範圍是 1,1 而z的範圍是 0,1 而w則...