OpenGL 3.3无法绘制我的三角形。

3
我正在使用C语言而不是C++来跟随这些教程: 教程2教程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个回答

1

这里开始。

OpenGL 3.0是最后一个完全支持固定和可编程功能的规范修订版。即使如此,自OpenGL 2.0一代以来,大多数硬件都缺乏实际的固定功能硬件。相反,系统使用着色器模拟固定功能流程。

在OpenGL 3.2中,核心配置文件缺少这些固定功能概念。兼容性配置文件保留它们。然而,大多数新版本的OpenGL功能无法与固定功能配合使用,即使在理论上它们可能会交互。

听起来你的OpenGL版本不支持固定功能管线。要么使用旧版本的OpenGL,要么像Tutorial 4中所示编写和加载着色器。


我已经完成了固定功能管线,一切都很好。在我的上一个问题中,我也加载了着色器,但我的三角形仍然没有被绘制出来。我还开始使用VAO来补充VBO,但仍然没有改变。我不知道该怎么办了。我会改进我的上一个问题并对其进行悬赏... - user2933244
事实证明,我创建了一个用于初始化VAO和VBO的函数...但是忘记调用它了。很抱歉浪费了您的时间。 - user2933244
不是浪费时间——你得到了一个解决方案,无论是这个答案帮助了你还是没有!很高兴你想出来了。;-) - Kaganar
2
@Xis88 也许你应该发表你的答案。 - sergej

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接