基本上和上次**沒什麼區別,主要是新加了乙個索引緩衝物件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...