opengl之路 3 畫矩形加了解索引緩衝物件

2021-09-11 20:13:13 字數 3557 閱讀 7137

基本上和上次**沒什麼區別,主要是新加了乙個索引緩衝物件ebo,如果不用兩個ebo畫兩個三角形需要重複定義兩個點兩次,浪費記憶體,所以我們通過ebo來根據頂點陣列索引來畫三角形節省記憶體,ebo用法和vao,vbo差不多

這個glpolygonmode(gl_front_and_back, gl_line);函式可以使圖形線條化

#include #include #include void framebuffer_size_callback(glfwwindow* window, int width, int height);

void processinput(glfwwindow *window);

// 設定寬高,弄成全域性變數便於修改

const unsigned int scr_width = 800;

const unsigned int scr_height = 600;

//頂點著色器

const char *vertexshadersource = "#version 330 core\n"

"layout (location = 0) in vec3 apos;\n"

"void main()\n"

"\0";

//片段著色器

const char *fragmentshadersource = "#version 330 core\n"

"out vec4 fragcolor;\n"

"void main()\n"

"\n\0";

int main()

glfwmakecontextcurrent(window);

glfwsetframebuffersizecallback(window, framebuffer_size_callback);

// glad初始化,因為glad控制opengl指標。所以在呼叫opengl函式前先初始化glad

if (!gladloadglloader((gladloadproc)glfwgetprocaddress))

//建立頂點著色器物件並去編譯

int vertexshader = glcreateshader(gl_vertex_shader);

glshadersource(vertexshader, 1, &vertexshadersource, null);

glcompileshader(vertexshader);

//檢測頂點著色器是否編譯成功

int success;

char infolog[512];

glgetshaderiv(vertexshader, gl_compile_status, &success);

if (!success)

//建立片段著色器物件並去編譯

int fragmentshader = glcreateshader(gl_fragment_shader);

glshadersource(fragmentshader, 1, &fragmentshadersource, null);

glcompileshader(fragmentshader);

//檢測片段著色器是否編譯成功

glgetshaderiv(fragmentshader, gl_compile_status, &success);

if (!success)

//鏈結頂點著色器和片段著色器

int shaderprogram = glcreateprogram();

glattachshader(shaderprogram, vertexshader);

glattachshader(shaderprogram, fragmentshader);

gllinkprogram(shaderprogram);

glgetshaderiv(shaderprogram, gl_link_status, &success);

if (!success)

//把著色器物件鏈結到程式物件以後,刪除著色器物件,因為用不到了

gldeleteshader(vertexshader);

gldeleteshader(fragmentshader);

//設定頂點資料

float vertices = ;

unsigned int indices = ;

unsigned int vbo, vao,ebo;

glgenvertexarrays(1, &vao); //生成頂點陣列物件(vao),任何隨後的頂點屬性呼叫都會儲存在這個vao

glgenbuffers(1, &vbo); //生成頂點緩衝物件(vbo)管理這個頂點記憶體

glgenbuffers(1, &ebo);//生成索引緩衝物件(ebo)

glbindvertexarray(vao); //繫結vao

glbindbuffer(gl_array_buffer, vbo); //把新建立的緩衝繫結到gl_array_buffer目標上

glbufferdata(gl_array_buffer, sizeof(vertices), vertices, gl_static_draw);//把頂點陣列複製到緩衝中供opengl使用

glbindbuffer(gl_element_array_buffer, ebo);//繫結ebo

glbufferdata(gl_element_array_buffer, sizeof(indices), indices, gl_static_draw);//把索引陣列複製到緩衝裡

//頂點著色器中使用layout(location = 0)定義了position頂點屬性的位置值

glvertexattribpointer(0, 3, gl_float, gl_false, 3 * sizeof(float), (void*)0);//這個函式告訴opengl該如何解析頂點資料

glenablevertexattribarray(0);//使用此函式,以頂點屬性位置值作為引數,啟用頂點屬性

glbindbuffer(gl_array_buffer, 0);

glbindvertexarray(0);

//glpolygonmode(gl_front_and_back, gl_line);

//渲染迴圈

while (!glfwwindowshouldclose(window)) //glfwwindowshouldclose函式在我們每次迴圈的開始前檢查一次glfw是否被要求退出,如果是的話該函式返回true然後渲染迴圈便結束了

//銷毀記憶體分配

gldeletevertexarrays(1, &vao);

gldeletebuffers(1, &vbo);

//銷毀視窗

glfwterminate();

return 0;

}//輸入控制

void processinput(glfwwindow *window)

//隨著視窗改變檢視也會跟著改變

void framebuffer_size_callback(glfwwindow* window, int width, int height)

OpenGL學習之路2 畫乙個點

放在github上 這一節比上一節 開啟乙個視窗 多了需要使用glew庫和3d數學庫 glew是opengl的擴充套件庫,用於幫助c c 開發者初始化擴充套件 opengl擴充套件功能 並書寫可移植的應用程式。這個可以通過上網搜教程自行安裝引用。3d函式庫可以用網上的,也可以用源教程裡的。這裡我是根...

OpenGL學習之路3 畫乙個三角形

放在github上 我們在螢幕上繪製圖形的時候,是在乙個歸一化的空間裡,即為下圖 可以看到繪製視窗左下角座標為 1.0,1.0 到右上角座標為 1.0,1.0 opengl math.h ifndef opengl math h define opengl math h 向量 typedef flo...

OpenGL舉例,MFC舉例 畫3條函式曲線

include math01.h define xstep 3.14 40 define xpoint 0.02 define pointnum 30 void drawrect glfloat x,glfloat y,glfloat w,glfloat h void callback displa...