0

私はOpenGLを学ぼうとしています。この本で見つけたコードをいくつか試しましたが、プログラムの出力は白い画面で、出力はシェルピンスキーの三角形になっているはずです。

何が間違っている可能性がありますか?私はMacOSX10.8とXcode4.5で開発しています

#include "Angel.h"
#include <iostream>

const int numPoints = 5000;
typedef vec2 point2;

void init(){

    point2 points[numPoints];
    point2 vertices[3] = {
        point2(-1.0, -1.0), point2(0.0, 1.0), point2(1.0, -1.0)
    };

    points[0] = point2(0.25, 0.5);

    for (int k = 1; k < numPoints; k++) {
        int j = rand()%3;
        points[k] = (points[k-1]+vertices[j])/2.0;
    }

    GLuint program = InitShader("vertex.glsl", "fragment.glsl");
    glUseProgram(program);

    GLuint abuffer;
    glGenVertexArraysAPPLE(1, &abuffer);
    glBindVertexArrayAPPLE(abuffer);

    GLuint buffer;
    glGenBuffers(1, &buffer);
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);

    GLuint location = glGetAttribLocation(program, "vPosition");
    glEnableVertexAttribArray(location);
    glVertexAttribPointer(location, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));

    glClearColor(1.0, 1.0, 1.0, 1.0);

}


void display(){
    glClear(GL_COLOR_BUFFER_BIT);
    glDrawArrays(GL_POINTS, 0, numPoints);
    glFlush();
}

int main(int argc, char** argv){

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_RGBA | GLUT_3_2_CORE_PROFILE);

    glutInitWindowSize(640, 480);

    glutCreateWindow("Sierpinski Gasket");

    init();

    glutDisplayFunc(display);

    glutMainLoop();

    return 0;
}
4

2 に答える 2

1

ついに !コードが完成し、シェーダーが適切に取り付けられました。

に含まれているはずの ではなく、 に.h含まれるファイルに問題があります。変更する 2 番目のことは、関数の接尾辞とを削除することです。Angel.h<OpenGL/OpenGL.h><OpenGL/gl3.h>APPLEglGenVertexArrayAPPLEglBindVertexArrayAPPLE

どうやら Apple とその OpenGL の実装に問題があるようです。おそらく、すべてのものと互換性があるわけではありませんが、そのトピックは専門家に任せます。誰かがそこにいる場合は、これを明確にしてください。

于 2013-01-27T20:46:40.113 に答える
1

あなたの例では、シェーダー プログラムのアタッチメント ステージを見逃しているようです。プログラマブル パイプラインを使用する場合、シェーダー プログラムにコンパイルされた少なくとも 1 つの頂点シェーダーとフラグメント シェーダーを提供する必要があります。次に、レンダリング ループで、glDrawArrays() またはその他のジオメトリ関連メソッドを呼び出す前にglUseProgram を介してシェーダー プログラムをバインドする必要があります。そうしないと、GPU が頂点データの処理方法を認識できません。最新の OpenGL を使い始めるために知っておく必要があるすべてのことを非常に詳細に説明しているこの素晴らしいチュートリアルをご覧ください。私の記憶が正しければ、OSX は GL 3.2 をサポートしているため、OSX で作業する場合は、一部の API メソッドに拡張機能を使用する必要があります。

シェーダーの取り付け方法を教えてください。私は本当に何も知りません。

そうでなければ、OpenGL アプリケーションの作成に進むことはできません。チュートリアルを注意深く読んで、シェーダー プログラムがどのように動作し、なぜ必要なのかをしっかりと把握してください。

于 2013-01-26T16:59:41.073 に答える