【问题标题】:Why glDrawArrays doesn't draw with OpenGL on mac为什么 glDrawArrays 不能在 mac 上使用 OpenGL 绘制
【发布时间】:2015-03-03 10:16:34
【问题描述】:

我是 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() {}

也许问题在于使用 APPLE 扩展(glGenVertexArraysAPPLE()glBindVertexArrayAPPLE())?

【问题讨论】:

    标签: c++ macos opengl


    【解决方案1】:

    据我从您的代码中看到的,您使用的是固定功能管道。但是这段代码:

    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 :-)
    • @Peregrin:欢迎您。随意接受答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多