0

私はOpenGLESを初めて使用し、学習曲線の一部としていくつかの基本的なことをしようとしています。2つのglDrawArrays呼び出しを使用して、球と立方体の2つのメッシュをレンダリングできました。立方体と球をラップするために別のテクスチャをロードしようとしていますが、最後にロードされたテクスチャが両方のメッシュにラップされています。なぜこれが起こっているのか誰かが知っていますか?

メッシュのコードは次のとおりです。

glEnable(GL_DEPTH_TEST);

glGenVertexArraysOES(1, &vertexArray);
glBindVertexArrayOES(vertexArray);

glGenBuffers(1, &vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeMeshVerts, meshVerts, GL_STATIC_DRAW);

glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 4*8, BUFFER_OFFSET(0));

glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 4*8, BUFFER_OFFSET(4*3));

glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 4*8, BUFFER_OFFSET(4*6));

// Texture
// Create image from file
NSString *path = [[NSBundle mainBundle] pathForResource:textureImage ofType:@"jpg"];
NSData *texData = [[NSData alloc] initWithContentsOfFile:path];
UIImage *image = [[UIImage alloc] initWithData:texData];

//新しいOpenGLESテクスチャバッファを生成し、//指定されたコアグラフィックス画像cgImageからのピクセルデータを使用して//バッファの内容を初期化します。

[TextureLoader textureWithCGImage:image.CGImage options:nil error:NULL];

glBindVertexArrayOES(0);

描画コードは次のとおりです。

glBindVertexArrayOES(_vertexArray);

// Render the object with ES2
glUseProgram(_program);

// Set the sampler texture unit to 0
glUniform1i (uniforms[UNIFORM_TEXTURE_MATRIX], 0);

glDrawArrays(GL_TRIANGLES, 0, numVertices);
4

1 に答える 1

1

レンダリングする前に、テクスチャをサンプラーにバインドしていません。GLKTextureInfoまず、によって返されるオブジェクトへの参照を保持する必要がありますtextureWithCGImage:。次に、テクスチャ名とともに使用glBindTextureして、現在のサンパーにバインドできます。例えば

GLKTextureInfo *tex = [TextureLoader textureWithCGImage:image.CGImage options:nil error:NULL];
...
glBindTexture(GL_TEXTURE_2D, tex.name);

サンプラーに正しいテクスチャを設定するには、各描画呼び出しの前にこれを行う必要があります。必要な各テクスチャを異なるサンプラーにバインドしてから、正しいサンプラーユニフォームを渡すこともできます。

于 2012-12-15T14:57:10.720 に答える