为什么在mac上使用OpenGL时,glDrawArrays无法绘制?

3

我对OpenGL不太熟悉,无法理解为什么窗口中没有显示任何内容。 我正在使用Mavericks(OS X 10.9.5),我想可能缺少某些东西。

#include <SFML/Window.hpp>
#include <SFML/OpenGL.hpp>
#include "FirstTriangleExample.h"

static const GLfloat g_vertex_buffer_data[] = {
        -1.0f, -1.0f, 0.0f,
        1.0f, -1.0f, 0.0f,
        0.0f,  1.0f, 0.0f,
};

GLuint vertexbuffer;
GLuint VertexArrayID;

void FirstTriangleExample::init() {
    glClearColor(0.0f, 0.0f, 0.4f, 0.0f);

    glGenVertexArraysAPPLE(1, &VertexArrayID);
    glBindVertexArrayAPPLE(VertexArrayID);

    glGenBuffers(1, &vertexbuffer);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);
}

// called in loop
void FirstTriangleExample::update() {
    glClear( GL_COLOR_BUFFER_BIT );

    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);

    glDrawArrays(GL_TRIANGLES, 0, 3);

    glDisableVertexAttribArray(0);

    glFlush();
}

void FirstTriangleExample::dispose() {
    glDeleteBuffers(1, &vertexbuffer);
    glDeleteVertexArraysAPPLE(1, &VertexArrayID);
    glDeleteProgram(programID);
}

以下示例中一切都正常(我可以看到红色正方形)。
#include "RedSquareExample.h"
#include <SFML/OpenGL.hpp>

void RedSquareExample::init() {}

void RedSquareExample::update() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glBegin(GL_QUADS);
    glColor3f(0.0f, 1.0f, 0.0f);
    glVertex2f(-0.5f, -0.5f);
    glVertex2f( 0.5f, -0.5f);
    glVertex2f( 0.5f,  0.5f);
    glVertex2f(-0.5f,  0.5f);
    glEnd();

    glFlush();
}

void RedSquareExample::dispose() {}

也许问题出在使用苹果扩展(glGenVertexArraysAPPLE()glBindVertexArrayAPPLE())上了?
1个回答

3
根据您的代码,我看到您正在使用固定功能管线。但是这段代码:
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);

该功能只适用于使用着色器的情况。如果是固定功能,您可能希望使用类似以下内容的东西

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, (void*)0);

此外,您没有正确使用VAO。 VAO的目的是存储将缓冲区绑定到属性的绑定,但您仍然在更新方法中重置了绑定。

你的措辞比我更好,覆盖范围也更广。加个赞 (+1) :) - Angew is no longer proud of SO
@Peregrin:不用谢。请随意接受答案。 - BDL

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