0

私は OpenGL に比較的慣れていないので、cocoa フレームワーク内で描画できるようにしたいと考えています。開発者ページからアップルのサンプルコードをいじってみましたが、これは非常にうまくいきました。ただし、その概念を理解するために、頂点構造体から描画できるようにしたいと考えています。OpenGLView に次のコードを使用すると、黒いウィンドウが表示されます (派手な色の三角形ではなく...)。

#import "MyOpenGLView.h" 
#include <OpenGL/gl.h>
#include <GLUT/GLUT.h>

@implementation MyOpenGLView

    typedef struct _vertexStruct{
        GLfloat position[2];
        GLubyte color[4];
    } vertexStruct;

- (void)drawRect:(NSRect) bounds
{
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    drawAnObject();
    glFlush();
}

static void drawAnObject()
{
    const vertexStruct vertices[] = {
        {{0.0f, 1.0f},{1.0, 0.0,0.0,1.0}},
        {{1.0f, -1.0f},{0.0, 1.0,0.0,1.0}},
        {{-1.0f , -1.0f},{0.0, 0.0,1.0,1.0}}
    };

    const GLshort indices[] = {0,1,2};
    glVertexPointer(2, sizeof(vertexStruct),0,&vertices[0].position);
    glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(vertexStruct), &vertices[0].color);
    glDrawElements(GL_TRIANGLES, sizeof(indices)/sizeof(GLshort), GL_SHORT, indices);
}

@end

ここで何が欠けていますか?

4

2 に答える 2

1

OS X 10.9 は OpenGL 4.1 を実行していると言っています

さて、あなたの問題があります。

「アクセス違反」エラーが表示されない理由はわかりませんが、OpenGL で非推奨の関数を使用しているためです。

次の関数は、使用している OpenGL バージョン 3.1 で廃止された関数の一部です。

  • glEnableClientState()
  • glVertexPointer()
  • glColorPointer()

すべてのgl*Pointer()関数が廃止された理由は、それらが固定関数パイプラインの一部であるためです。すべてがシェーダーベースになり、VBO (および IBO) で VAO を使用することになっます

VAO に付随する機能は次のとおりです。

作成

  • glEnableVertexAttribArray()
  • glVertexAttribPointer()

レンダリング

  • glBindVertexArray()
  • glDrawArrays()
  • glDrawElements()

はい、glDrawArrays()まだglDrawElements()使用されており、VAO の VBO を作成してバインドする必要がある場合は、以前と同じ方法でそれを行います。

于 2013-11-04T08:23:47.997 に答える
0
glVertexPointer(2, sizeof(vertexStruct),0,&vertices[0].position);

する必要があります

glVertexPointer(2, GL_FLOAT,sizeof(vertexStruct),0);

これは、0 から始まる 12 バイトのブロックで 2 つの float を読み取ることを指定します (ブロック内の最初の 2 つの float)

于 2013-11-04T08:19:45.697 に答える