OpenGL入門(二):繪製一個點
阿新 • • 發佈:2019-02-09
GLuint vbo;//儲存頂點緩衝區控制代碼
static void renderSenceCB(){
glClear(GL_COLOR_BUFFER_BIT);//使用設定的清除快取幀顏色清除幀
glEnableVertexAttribArray(0);//啟用每個頂點屬性的索引(這一節中我們還沒使用任何 Shader,但是我們載入到緩衝器的頂點位置屬性在固定函式管線(在沒有繫結著色器的時候就自動啟用固定管線)中被看做頂點屬性索引為0。你必須啟用所有的頂點屬性,否則管線將接收不到資料)
glBindBuffer(GL_ARRAY_BUFFER, vbo);//繫結緩衝區
glVertexAttribPointer(0 , 3, GL_FLOAT, GL_FALSE, 0, 0);//管線如何在緩衝區內部解釋資料,第一個引數指定索引,第二個引數構成屬性的分量個數(X,Y,Z共3個)第三個引數指定每個分量的資料型別 第四個指定在管線使用前是否與要規範化 第五個引數表示兩個相同屬性的間隔(步長) 第六個引數快取區中儲存資料的偏移值
glDrawArrays(GL_POINTS, 0, 1);//繪製 第一個引數:繪製型別為gl_points 畫點,第二個引數 第一個頂點的索引值 第三個引數 畫點個數,
glDisableVertexAttribArray(0);//當不需要使用頂點時 禁用頂點
glutSwapBuffers();
}
static void initializeGlutCallback(){
glutDisplayFunc(renderSenceCB);
}
static void createVertexBuffer(){
Vector3f vector3f[1] ={Vector3f(0.0f,0.0f,0.0f)};
glGenBuffers(1, &vbo);//建立buffer 1:表示數量 &vbo
glBindBuffer(GL_ARRAY_BUFFER, vbo);//繫結buffer到指定目標 指定vbox儲存內容
glBufferData(GL_ARRAY_BUFFER, sizeof (vector3f), vector3f, GL_STATIC_DRAW);//填充buffer資料 gl_static_draw/gl_dynamic_draw 指定畫的方式
}
int main(int argc,char *argv[]){
glutInit(&argc, argv);//初始化glut
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);//顯示模式:雙快取 rgba模式
glutInitWindowSize(640, 480);//視窗大小
glutInitWindowPosition((GLUT_SCREEN_WIDTH-GLUT_WINDOW_WIDTH)/2,(GLUT_SCREEN_HEIGHT-GLUT_WINDOW_WIDTH)/2);//視窗位置
glutCreateWindow("Draw a Point");//視窗名稱
initializeGlutCallback();//窗體回撥
GLenum res = glewInit();//初始化glew
if(res!=GLEW_OK){
cerr<<"init glew error, error:"<<glewGetErrorString(res)<<endl;//列印glew 初始化錯誤
return 1;
}
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);//設定清除快取幀顏色
////////////////////
createVertexBuffer();//建立頂點buffer
////////////////////
glutMainLoop();//開啟glut內部迴圈
}