2013-07-25 37 views
0

我幾年沒見過OpenGl,現在我試圖編寫任何新風格的代碼,但我有問題繪製簡單的三角形。首先,我找不到任何帶有很好例子的教程,並且沒有使用'支持庫',但那不是重點,下面的代碼應該(如我所知)繪製紅色三角形,而不是繪製白色三角形,而是繪製白色三角形我做錯了嗎?我如何啓用着色器使用乾淨的xlib與opengl

dpy = XOpenDisplay(NULL); 
glxWin = generateXWindow(dpy); 

glEnable(GL_DEPTH_TEST); 
glShadeModel(GL_SMOOTH); 
glDepthFunc(GL_LESS); 

float points[] = { 
    0.0f, 0.5f, 0.0f, 
    0.5f, -0.5f, 0.0f, 
    -0.5f, -0.5f, 0.0f 
}; 

unsigned int vbo = 0; 
glGenBuffers (1, &vbo); 
glBindBuffer (GL_ARRAY_BUFFER, vbo); 
glBufferData (GL_ARRAY_BUFFER, 9 * sizeof (float), points, GL_STATIC_DRAW); 

unsigned int vao = 0; 
glGenVertexArrays (1, &vao); 
glBindVertexArray (vao); 
glEnableVertexAttribArray (0); 
glBindBuffer (GL_ARRAY_BUFFER, vbo); 
glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 0, (GLubyte*)NULL); 

const char* fragmet_shader = "out vec4 frag_colour; void main() { frag_colour = vec4 (0.7, 0.0, 0.7, 1.0); }"; 
const char* vertex_shader = "in vec3 vp; void main() { gl_Position = vec4 (vp, 1.0); }"; 

unsigned int vs = glCreateShader(GL_VERTEX_SHADER); 
glShaderSource(vs, 1, &vertex_shader, NULL); 
glCompileShader(vs); 
unsigned int fs = glCreateShader(GL_FRAGMENT_SHADER); 
glShaderSource(fs, 1, &fragmet_shader, NULL); 
glCompileShader(fs); 

unsigned int shader_program = glCreateProgram(); 
glAttachShader(shader_program, fs); 
glAttachShader(shader_program, vs); 
glLinkProgram(shader_program); 

glVertexPointer(3, GL_FLOAT, 0, NULL); 
glEnableClientState(GL_VERTEX_ARRAY); 

glClearColor(0.2, 0.2, 0.2, 1.0); 
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glUseProgram (shader_program); 
glBindVertexArray (vao); 
glDrawArrays (GL_TRIANGLES, 0, 3); 

glFlush(); 
glXSwapBuffers(dpy, glxWin); 
+0

'generateXWindow()'的實現在哪裏? – genpfault

回答

0

一兩件事,在我腦海中:您使用的是更現代的着色器的語法與inout但沒有宣佈任何着色器版本,所以它會回到默認1.10不支持這種語法。使用像#version 130這樣的預處理器指令作爲着色器源代碼的第一行(不要忘記此處的換行符,這對於預處理器指令很重要)。

您還應該檢查GL錯誤,特別是着色器/程序的編譯和鏈接狀態,並查詢信息日誌。