2015-09-06 45 views
3

我使用C而不是C++來關注這些教程: Tutorial 2short extension to tutorial 2OpenGL 3.3不會繪製我的三角形

我對端口進行的唯一更改是將Vector3f[3]更改爲GLfloat[9]。與GLfloat[1]而不是Vector3f[1]版本正常工作。我認爲這種變化可能是glDrawArrays無法正常工作的原因,但我不知道如何解決它。

#include <stdio.h> 
#include <GL/glew.h> 
#include <GL/freeglut.h> 

GLuint VBO_id; 

static void RenderSceneCB() 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 

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

    glDrawArrays(GL_TRIANGLES, 0, 3); 

    glDisableVertexAttribArray(0); 

    glutSwapBuffers(); 
} 

static void CreateVertexBuffer() 
{ 
    GLfloat Vertices[9] = { -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, 0.0f, 
          1.0f, 0.0f }; 

    glGenBuffers(1, &VBO_id); 
    glBindBuffer(GL_ARRAY_BUFFER, VBO_id); 
    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(600, 600); 
    glutInitWindowPosition(100, 100); 
    glutCreateWindow("Tutorial 03"); 
    glutDisplayFunc(RenderSceneCB); 

    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; 
} 

回答

2

here

OpenGL 3.0是該規範的最後一個版本,完全支持固定和可編程功能。即便如此,自Ope​​nGL 2.0代以來,大多數硬件都缺乏實際的固定功能硬件。相反,固定功能過程是用系統構建的着色器來模擬的。

在OpenGL 3.2中,Core Profile缺少這些固定功能的概念。兼容性配置文件可以保持它們。但是,OpenGL的大部分新功能都無法使用固定功能,即使它們在理論上可能會進行交互。

聽起來像您的OpenGL版本不支持固定功能管道。或者使用舊版本的OpenGL,它執行或寫入並加載着色器,如Tutorial 4中所示。

+0

我做了固定功能管道,一切都很好。我在最後一個問題中也加載了着色器,但我的三角形仍然沒有繪製。除了VBO之外,我還開始使用VAO。仍然沒有變化。我不知道該怎麼辦。我會改進我的最後一個問題,並給它一個賞金... –

+0

事實證明,我創建了一個函數來初始化VAO和VBO ...但忘了調用它。對不起,我浪費了你的時間。 –

+0

不是浪費時間 - 你有一個解決方案,無論是這個答案,幫助你或不!很高興你想出來了。 ;-) – Kaganar