4

私はここ数日で OpenGL ES 2.0 に飛び込み始めましたが、それでも本当に不完全な結果が得られます。私がよく理解していないことの 1 つは、バッファーを正しく設定する方法です。

私はこのような形を作りたいと思っています。左右の側面がないテントのようなものです。

3_______________________2
|\                     /|
| \_ _ _ _ _ _ _ _ _ _/ |          
| /4                 5\ |
|/_____________________\|
0                       1

それでは、Texture/Indices/Vertices Array から始めましょう。

それが私が設定したものです:

#define RECT_TOP_R      {1, 1, 0}
#define RECT_TOP_L      {-1, 1, 0}
#define RECT_BOTTOM_R   {1, -1, 0}
#define RECT_BOTTOM_L   {-1, -1, 0}
#define BACK_RIGHT      {1, 0, -1.73}
#define BACK_LEFT       {-1, 0, -1.73}

const GLKVector3 Vertices[] = {
    RECT_BOTTOM_L,  //0
    RECT_BOTTOM_R,  //1
    RECT_TOP_R,     //2
    RECT_TOP_L,     //3
    BACK_LEFT,      //4
    BACK_RIGHT      //5

};

const GLKVector4 Color[] = {
    {1,0,0,1},
    {0,1,0,1},
    {0,0,1,1},
    {0,1,0,1},
    {1,0,0,1},
    {0,1,0,1},
    {0,0,1,1},
    {0,1,0,1}
};

const GLubyte Indices[] = {
    0,1,3,
    2,4,5,
    0,1
};

const GLfloat texCoords[] = {
    0,0,
    1,0,
    0,1,
    1,1,
    1,1,
    0,0,
    0,0,
    1,0
};

ここでは、バッファを生成/バインドします。

glGenBuffers(1, &vertexArray);
glBindBuffer(GL_ARRAY_BUFFER, vertexArray);
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition,3,GL_FLOAT,GL_FALSE,sizeof(Vertices),0);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);

glGenBuffers(1, &indexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW);


glGenBuffers(1, &colArray);
glEnableVertexAttribArray(GLKVertexAttribColor);
glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, sizeof(Color), 0);
glBufferData(GL_ARRAY_BUFFER, sizeof(Color), Color, GL_STATIC_DRAW);

glGenBuffers(1, &texArray);
glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(texCoords),0);
glBufferData(GL_ARRAY_BUFFER, sizeof(texCoords), texCoords, GL_STATIC_DRAW);

だから私はバッファに関する質問があります:

  • GL_ARRAY_BUFFER と GL_ELEMENT_ARRAY_BUFFER の違いは何ですか?

これは、再描画するたびに呼び出される geolegate メソッドです。

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {


    self.contentScaleFactor = 2.0;
    self.opaque = NO;

    glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    [self.effect prepareToDraw];

    glDrawElements(GL_TRIANGLE_STRIP, sizeof(Indices), GL_UNSIGNED_BYTE, 0);


}  

したがって、コードは明らかにそれに応じて機能しません。手伝っていただけませんか ?私はそれを機能させようとしてきましたが、神経を失っています。

4

2 に答える 2

0

さて、私は間違いなくそこで何か間違ったことをしました。基本的にすべての頂点データを1つの構造体に格納しているWebサイトのコードを再利用しました。ただし、個々の属性配列(色、テクスチャ座標)を個々の配列に分離するという点で、コードを変更しました。以前は、構造体はそれ自体でバッファリングされていたため、構造体はテクスチャ配列とカラー配列を使用してGPU全体で処理されていました。変更後、これらのバッファを個別に生成してバインドする必要があります。

私が部分的に解決できたもう1つの問題は、インデックスとテクスチャマッピングの問題でした。その権利を理解したかどうかはわかりませんが、テクスチャ座標(x、y)を特定のインデックスに割り当ててから、そのインデックスを再利用して、その正確な場所に別のテクスチャ座標を設定する場合は、どうやらわかりません。なぜすべてが台無しになっているのか疑問に思う理由があります。

最終的に問題を解決することはできませんでしたが、設定した目標にかなり近づき、openGLに関する限り、学習曲線を非常に誇りに思っています。この回答は、同じ問題に直面する可能性のある他の人を対象としています。ここで間違った情報を広めないことを願っています。間違いを編集/指摘してください。

于 2012-12-25T01:47:48.357 に答える
0

あなた自身の答えに応じて、あなたが言及した構造体の頂点データは配列の構造体と呼ばれます。Apple は、このレイアウトを使用することをお勧めします。

于 2013-01-19T23:24:49.597 に答える