OpenGL 3.3不会画出我的三角形

时间:2015-09-06 15:56:47

标签: c opengl

我使用C而不是C ++来学习这些教程: Tutorial 2short extension to tutorial 2

我移植它的唯一变化是将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; 
}

1 个答案:

答案 0 :(得分:2)

来自here

  

OpenGL 3.0是该规范的最新版本,完全支持固定和可编程功能。即便如此,自Ope​​nGL 2.0生成以来,大多数硬件都缺少实际的固定功能硬件。相反,固定功能过程使用系统构建的着色器进行模拟。

     

在OpenGL 3.2中,核心配置文件缺乏这些固定功能概念。兼容性配置文件可以保留它们。但是,OpenGL的大多数新功能都无法使用固定功能,即使它们在理论上似乎可以进行交互。

听起来你的OpenGL版本不支持固定功能管道。如Tutorial 4所示,使用较旧版本的OpenGL执行或编写并加载着色器。