2014-05-15 160 views
2

我無法渲染一個簡單的三角形。下面的代碼編譯並運行,除了沒有任何三角形;只有一個黑色的背景。三角形不渲染

GLuint VBO; 

static void RenderSceneCB() 
{ 
    //glClear sets the bitplane area of the window to values previously selected by glClearColor, glClearDepth, and glClearStencil. 
    glClear(GL_COLOR_BUFFER_BIT); 

    glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, VBO); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 

    glDrawArrays(GL_TRIANGLES, 0, 3); 

    glDisableVertexAttribArray(0); 

    //swaps the buffers of the current window if double buffered. 
    glutSwapBuffers(); 
} 

static void InitializeGlutCallbacks() 
{ 
    glutDisplayFunc(RenderSceneCB); 
} 

static void CreateVertexBuffer() 
{ 
    Vector3f Vertices[3]; 
    Vertices[0] = Vector3f(-1.0f, -1.0f, 0.0f); 
    Vertices[1] = Vector3f(1.0f, -1.0f, 0.0f); 
    Vertices[2] = Vector3f(0.0f, 1.0f, 0.0f); 

    glGenBuffers(1, &VBO); 
    glBindBuffer(GL_ARRAY_BUFFER, VBO); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW); 
} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA); 
    glutInitWindowSize(1024, 768); 
    glutInitWindowPosition(100, 100); 
    glutCreateWindow("Tutorial 02"); 

    InitializeGlutCallbacks(); 

    // Must be done after glut is initialized! 
    GLenum res = glewInit(); 
    if (res != GLEW_OK) { 
     fprintf(stderr, "Error: '%s'\n", glewGetErrorString(res)); 
     return 1; 
    } 
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 

    CreateVertexBuffer(); 

    glutMainLoop(); 

    return 0; 
} 
+4

我對OpenGL本人相當陌生,但看起來像需要着色器的「新」OpenGL。對於一個非常好的教程,我推薦[這一個](http://arcsynthesis.org/gltut/index.html),你可能想閱讀[「你好三角形」](http://arcsynthesis.org/gltut /Basics/Tutorial%2001.html)一章。 –

+0

也許嘗試改變整個屏幕的顏色使用'glClearColor()'並在glClear'glLoadIdentity'後調用這個函數' – mr5

+0

@ReetoKoradi - 謝謝....這工作! – SINGULARITY

回答

3

既然你沒有着色器,OpenGL的不知道如何解釋你的頂點屬性0,因爲它僅知道位置,顏色等,不是一般的屬性。請注意,這可能適用於某些GPU,因爲它們會將通用屬性映射到相同的「插槽」,然後將零解釋爲位置(通常NVidia對這些問題的要求不太嚴格)。

您可以使用MiniShader,只要把下面的代碼CreateVertexBuffer();後:

minish::InitializeGLExts(); // initialize shading extensions 
const char *vs = 
    "layout(location = 0) in vec3 pos;\n" 
    // the layout specifier binds this variable to vertex attribute 0 
    "void main()\n" 
    "{\n" 
    " gl_Position = gl_ModelViewProjectionMatrix * vec4(pos, 1.0);\n" 
    "}\n"; 
const char *fs = "void main() { gl_FragColor=vec4(.0, 1.0, .0, 1.0); }"; // green 
minish::CompileShader(vs, fs); 

注意,我寫了,從我的頭頂上,萬一有一些錯誤,請評論。

+0

由於這被認爲是重複的,也許最好是將答案添加到原始問題中?我將代碼區分到舊問題中的代碼,並且完全相同。 –

+0

@ReetoKoradi你是對的,我沒有注意到重複,在我寫回答之後,問題被標記。我在那裏擴展我的答案http://stackoverflow.com/questions/23097007/how-can-i-make-opengl-draw-something-using-vbos-in-xcode/23696380#23696380。 –