2015-09-06 53 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