2012-11-29 108 views
0

我試圖讓一個超級簡單的GLFW和VBO的例子運行,但我卡住了。對於其他項目,我使用了glBeginglEnd,但我試圖更新我的代碼以使用OpenGL ES 2,但現在我只想盡可能地向前兼容。與簡單的VBO例子的麻煩

從網上一些例子,我想出了下面的代碼:

#include <stdlib.h> 
#include <GL/glfw3.h> 
#include <stdio.h> 

#define bool int 
#define true 1 
#define false 0 

const int width = 800; 
const int height = 600; 
bool opened = true; 

GLuint glTriangle; 
GLfloat triangle[] = { 
    -1.0f, -1.0f, 0.0f, 
    1.0f, -1.0f, 0.0f, 
    0.0f, 1.0f, 0.0f, 
}; 

void init() { 
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 

    glGenBuffers(1, &glTriangle); 
    glBindBuffer(GL_ARRAY_BUFFER, glTriangle); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(triangle), triangle, GL_STATIC_DRAW); 
} 

void display() { 
    glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, glTriangle); 

    glVertexAttribPointer(0L, 3, GL_FLOAT, GL_FALSE, 0, 0); 
    glDrawArrays(GL_TRIANGLES, 0, 3); 

    glDisableVertexAttribArray(0); 
} 

int windowClose(GLFWwindow window) { 
    opened = false; 
    return GL_TRUE; 
} 

void main() { 
    if (!glfwInit()) { 
     printf("glfwInit didn't work\n"); 
     return; 
    } 

    GLFWwindow window = glfwCreateWindow(width, height, GLFW_WINDOWED, "Test", 0); 
    glfwMakeContextCurrent(window); 

    init(); 

    glfwSetWindowCloseCallback(window, windowClose); 

    glfwSwapInterval(1); 

    while(opened) { 
     display(); 

     glfwSwapBuffers(window); 
     glfwPollEvents(); 
    } 
    glfwTerminate(); 
} 

此代碼運行,但我得到的是一個黑色的屏幕時,我希望看到一個白色的三角形。我試圖避免像shaders /紋理那樣的任何幻想,直到我至少在屏幕上畫東西。

如果有問題,我正在編譯:Linux上的gcc -o test -lGL -lglfw -lm test.c,通過Mesa驅動程序與OpenGL版本2.1。

我在做什麼錯?如果我需要指定顏色信息,那麼簡單的方法是什麼?

回答

2

您不應該在固定管道中使用glEnableVertexAttribArray/glVertexAttribPointer。它可能工作(我不積極,我認爲attrib 0可能別名頂點attrib數組,但不知道)。這樣做並不是真的正確。

如果你沒有着色器,你應該使用glEnableClientStateglVertexPointer作爲頂點數據。

默認顏色是(1,1,1,1),所以我認爲你現在應該在顏色上確定。

+0

不推薦使用「glEnableClientState」和「glVertexPointer」嗎?這就是爲什麼我用另外兩個。 – tjameson

+1

@tjameson:不;他們被*刪除*,不被棄用。其餘的固定功能流水線也是如此。如果您想要依賴非核心3.1+ OpenGL功能,您*需要*着色器進行渲染。 –

+0

我想這是給出問題的最佳答案。我決定找出着色器(實際上並不太難),現在它正在工作。感謝@NicolBolas,這正是我所期待的。 – tjameson