0

非常に単純なGLFWとVBOの例を実行しようとしていますが、行き詰まっています。私は他のプロジェクトで使用glBeginしましglEndたが、OpenGL ES 2で動作するようにコードを更新しようとしていますが、今のところ、可能な限り上位互換性を保ちたいと思っています。

オンラインのいくつかの例から、私は次のコードを思いついた:

#include <stdlib.h>
#include <GL/glfw3.h>
#include <stdio.h>

#define bool int
#define true 1
#define false 0

const int width = 800;
const int height = 600;
bool opened = true;

GLuint glTriangle;
GLfloat triangle[] = {
    -1.0f, -1.0f, 0.0f,
    1.0f, -1.0f, 0.0f,
    0.0f,  1.0f, 0.0f,
};

void init() {
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

    glGenBuffers(1, &glTriangle);
    glBindBuffer(GL_ARRAY_BUFFER, glTriangle);
    glBufferData(GL_ARRAY_BUFFER, sizeof(triangle), triangle, GL_STATIC_DRAW);
}

void display() {
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, glTriangle);

    glVertexAttribPointer(0L, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glDrawArrays(GL_TRIANGLES, 0, 3);

    glDisableVertexAttribArray(0);
}

int windowClose(GLFWwindow window) {
    opened = false;
    return GL_TRUE;
}

void main() {
    if (!glfwInit()) {
        printf("glfwInit didn't work\n");
        return;
    }

    GLFWwindow window = glfwCreateWindow(width, height, GLFW_WINDOWED, "Test", 0);
    glfwMakeContextCurrent(window);

    init();

    glfwSetWindowCloseCallback(window, windowClose);

    glfwSwapInterval(1);

    while(opened) {
        display();

        glfwSwapBuffers(window);
        glfwPollEvents();
    }
    glfwTerminate();
}

このコードは実行されますが、白い三角形が表示されると予想したときに表示されるのは黒い画面だけです。少なくとも画面に何かがペイントされるまで、シェーダー/テクスチャのような派手なものは避けようとしました。

それが重要な場合、私は次のようにコンパイルしています:gcc -o test -lGL -lglfw -lm test.cLinuxでOpenGLバージョン2.1を使用してMesaドライバーを使用します。

私は何が間違っているのですか?色情報を指定する必要がある場合、それを行う簡単な方法は何ですか?

4

1 に答える 1

2

glEnableVertexAttribArray / glVertexAttribPointer固定パイプラインで使用するべきではありません。それはうまくいくかもしれません(私は肯定的ではありません、属性0は頂点属性配列にエイリアスするかもしれないと思いますが、確かではありません)。そうすることは本当に正しくありません。

シェーダーがない場合は、頂点データに使用する必要がありglEnableClientStateますglVertexPointer

デフォルトの色は(1,1,1,1)なので、今のところ色は問題ないと思います。

于 2012-11-29T19:25:18.817 に答える