1. 程式人生 > >OpenGL入門(二):繪製一個點

OpenGL入門(二):繪製一個點

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內部迴圈 }