iOS で OpenGL ES を 2 つ以上の属性で適切に動作させようとしていますが、何らかの理由で実際のオブジェクトではなく法線を描画しているようです。
私の頂点シェーダー:
attribute vec4 position;
attribute vec3 tc;
attribute vec3 normal;
uniform vec3 color;
uniform mat4 modelViewProjectionMatrix;
uniform mat3 normalMatrix;
varying lowp vec3 Color;
void main()
{
vec3 eyeNormal = normalize(normalMatrix * normal);
vec3 lightDirection = vec3(0.0, 0.0, 1.0);
float nDot = max(0.0, dot(eyeNormal, normalize(lightDirection)));
Color = tc * nDot;
gl_Position = modelViewProjectionMatrix * position;
}
あなたが期待するように、属性への参照を取得します。
glBindAttribLocation(_program, GLKVertexAttribPosition, "position");
glBindAttribLocation(_program, GLKVertexAttribTexCoord0, "tc");
glBindAttribLocation(_program, GLKVertexAttribNormal, "normal");
NSMutableArray コンテナを使用して Vector オブジェクトを格納します。最初の Vector オブジェクトは位置を表し、その次のオブジェクトはテクスチャ データを表し、その次のオブジェクトは法線を表します。これが繰り返され、配列には通常約 5000 個の Vector オブジェクトが含まれます。その配列の内容は、次のコードでバッファーに読み込まれます。
float *buffer = (float*) calloc(vBuffer.count * 3, sizeof(float));
int bufferIndex = 0;
for(int i =0; i < [vBuffer count]; i++) {
vector3 *vec = (vector3*) vBuffer[i];
buffer[bufferIndex] = vec.x;
buffer[bufferIndex+1] = vec.y;
buffer[bufferIndex+2] = vec.z;
bufferIndex += 3;
}
次に、予想どおりに glVertexAttribPointer をセットアップします。
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
glVertexAttribPointer(GLKVertexAttribTexCoord0, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(12));
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(24));
私がコンパイルすると、これが描画されます: http://i.imgur.com/Q0QLsHd.png。法線を表す Vector オブジェクトを NSMutableArray に含めない場合、意図した結果が得られます (奇妙に色付けされていますが、これはテクスチャ座標を色として読み取っているためです。無視してください): http://i. imgur.com/DOFZxaq.png .
3 番目の属性をバッファーに追加すると、すべてが台無しになるのはなぜですか?
.obj ファイル内の face ステートメントの解析に基づいて、位置、テクスチャ、および法線を配列に追加するコードを次に示します。
if(v < INT32_MAX && v != 0) {
vector3 *position = (vector3*) _vertices[v-1];
[vBuffer addObject:position];
}
if(vt < INT32_MAX && vt != 0) {
vector3 *texture = (vector3*) _textures[vt-1];
[vBuffer addObject:texture];
}
if(vn < INT32_MAX && vn != 0) {
vector3 *normal = (vector3*) _normals[vn-1];
[vBuffer addObject:normal];
}
XCode の OpenGL テンプレートに基づいて新しいテスト プロジェクトを作成し、3 番目の属性を追加したところ、正常に機能したため、この特定のプロジェクトの問題の原因がわかりません。バッファのサイズですか?そこには約15,000のフロートが保管されています。