2013-07-02 239 views
0

蔭試圖寫一個小OpenGL圖像只使用頂點緩衝對象畫出一個三角形(不使用VAO)秒,但每當我想編譯它,那隻能說明一個藍色屏幕OpenGL繪圖與VBO

這裏是我的代碼

#include <iostream> 
#include <GLUT/glut.h> 
#include <OpenGL/gl3.h> 

GLuint VBO; 
GLuint VAO; 

void display(); 

float vertex[] = {-1.0, 0.0 , 0.0, 
        0.0 , 1.0 , 0.0 , 
        1.0 , 0.0 , 0.0 }; 

int main (int argc, char *argv[]) 

{ 
glutInit(&argc, argv); 
glutInitDisplayMode(GLUT_DOUBLE); 
glutInitWindowSize(1000, 400); 
glutInitWindowPosition(100, 100); 
glutCreateWindow("My First GLUT/OpenGL Window"); 
glutDisplayFunc(display); 
glutMainLoop(); 
return 0; 
} 

void display() 

{ 
glClearColor(0, 0, 1,1); 
glClear(GL_COLOR_BUFFER_BIT); 

glGenBuffers(1,&VBO); 
glBindBuffer(GL_ARRAY_BUFFER, VBO); 
glBufferData(GL_ARRAY_BUFFER,9 *sizeof(vertex),vertex, GL_STATIC_DRAW); 

glEnableVertexAttribArray(0); 

glVertexAttribPointer(0, 3,GL_FLOAT, GL_TRUE, 0, 0); 


glDrawArrays(GL_TRIANGLES, 0, 3); 

glDisableVertexAttribArray(0); 

glutSwapBuffers(); 
}; 
+0

你的着色器在哪裏?另外,爲什麼你不使用'glVertexPointer()'? – genpfault

+0

Iam新的Opengl編程&我想探索用opengl繪製不同的方式,所以下面的一些在線教程(這並沒有涵蓋程序的每一點)我想出了這個代碼,但我知道我們應該提供我們的着色器程序.. – BulBul

回答

2

三個問題:

  • 您的代碼錯過設置視口(如果窗口正好與一個大小爲0×0被創建,只是後來被調整的我nitial視口大小將爲0×0)。

  • 您使用sizeof運算符是錯誤的。 vertex是一個靜態分配的數組,因此sizeof運算符將返回頂點數組的總大小,nout只是單個元素的大小。所以在這種特殊情況下,只需sizeof(vertex)而不用9乘以就足夠了。

最後但並非最不重要的,和你的問題的真正原因:

  • 哪裏着色器?使用通用頂點屬性,當然,OpenGL-3必須提供頂點和片段着色器的有效組合。沒有這些,什麼都不會呈現。
+0

其實我從網絡教程中遇到了所有這些問題,有一些教程將sizeof運算符乘以一個常量,而關於着色器,我已經知道頂點和片段着色器是強制性的,但正如我在那之前提到的那樣是一些沒有提到程序的所有方面的在線教程,我認爲通過不指定着色器我們讓OpenGl使用某種默認着色器程序,可能就像是一個簡單的傳遞着色器:P,無論如何謝謝爲您的答案.. – BulBul

+0

@BulBul:OpenGL中沒有默認着色器。使用OpenGL-2並使用非通用頂點屬性(glVertexPointer,glNormalPointer,glEnableClientState(GL_VERTEX_ARRAY)等),可以默認使用固定函數管道。關於sizeof運算符,我認爲你提到的教程要麼寫了'sizeof(v [0])'或'sizeof(* v)',並且對一個指針不是靜態分配數組。既然你不知道這個微妙的事情,我強烈建議你打磨你的C/C++知識。 – datenwolf

+0

從我讀過的C編程書籍之一的定義中得到:>>>數組的名稱(不指定索引)是指向該數組中第一個元素的指針,例如:「vertex」等價於「頂點[0]」,但它似乎像sizeof()運算符以完全不同的方式工作比我預期的。 – BulBul