簡體   English   中英

為什么glDrawArrays不能在Mac上使用OpenGL繪制

[英]Why glDrawArrays doesn't draw with OpenGL on mac

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

據我所知,您正在使用固定功能管道。 但是這段代碼:

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的目的是將緩沖區的綁定存儲到屬性中,但無論如何都要在update方法中重置綁定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM