1

OpenGLES 2.0を使用し、シェーダーも使用するデフォルトのテンプレートに基づいて、オブジェクト指向のiOSアプリを大まかにノックアップしましたが、これを以前に呼び出していたモデルにロードしようとしています。

#import "./sphere_model.h"
glVertexPointer(3, GL_FLOAT, 0, sphere_modelVerts);
glNormalPointer(GL_FLOAT, 0, sphere_modelNormals);
glDrawArrays(GL_TRIANGLES, 0, sphere_modelNumVerts);

上記のコードを使用した理由は、.objファイルを、定義する必要のあるすべての配列に含めることができるファイルに変換したためです(obj2openglを参照)。現在、私は100%でglVertexPointerはありませんが、非推奨の場所を読んでおり、デモアプリでこれを機能させるのに苦労しています。現在、私はこの単純な立方体を描いています:

立方体!

代わりに、OpenGLシェーダーコードを使用して使用したテンプレートと、使用glVertexAttribPointerした頂点配列は、同じ配列内に法線が含まれているため、わずかに異なります。

GLfloat gCubeVertexData[216] =
{
    // Data layout for each line below is:
    // positionX, positionY, positionZ,     normalX, normalY, normalZ,
    0.5f, -0.5f, -0.5f,        1.0f, 0.0f, 0.0f,
    0.5f, 0.5f, -0.5f,         1.0f, 0.0f, 0.0f,
    0.5f, -0.5f, 0.5f,         1.0f, 0.0f, 0.0f,
    0.5f, -0.5f, 0.5f,         1.0f, 0.0f, 0.0f,
    0.5f, 0.5f, -0.5f,          1.0f, 0.0f, 0.0f,
    0.5f, 0.5f, 0.5f,         1.0f, 0.0f, 0.0f,
    ....
};

このコードを使用して、キューブを描画します(シェーダーファイルをロードした後)。

glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexData), gCubeVertexData, GL_STATIC_DRAW);

glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));

glUseProgram(GetProgram());

glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m);
glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m);

glDrawArrays(GL_TRIANGLES, 0, 36);

glDisableVertexAttribArray(GLKVertexAttribNormal);
glDisableVertexAttribArray(GLKVertexAttribPosition);

glBindVertexArrayOES(0);

さて、私の質問は、Open GLES 2.0を使用して、シェーダーを使用している間ではなく、obj2opengl使用して前述したように定義された頂点をロードすることは可能ですか?glVertexAttribPointerglVertexPointer

モデルファイルの1つからのサンプルを次に示します。

unsigned int sphere_modelNumVerts = 864;

float sphere_modelVerts [] = {
    -1.93077099209747e-18, 0.49025, 0.098,
    0.098, 0.49025, -1.78225014655151e-18,
    -1.93077099209747e-18, 0.5, -1.78225014655151e-18,
    -1.93077099209747e-18, 0.44725, 0.2235,
    0.11775, 0.4715, 0.11775,
    -1.93077099209747e-18, 0.49025, 0.098,
    ...
}

float sphere_modelNormals [] = {
    0, 0.980579906452681, 0.196119981290155,
    0.196119981290155, 0.980579906452681, 0,
    0, 1, 0,
    0, 0.894429190989163, 0.447209595499104,
    ...
}

float sphere_modelTexCoords [] = {
    0.75000, 0.0628300000000001,
    1, 0.0628300000000001,
    0.87500, 0,
    0.75000, 0.14758,
    ...
}
4

1 に答える 1

3

配列の構造体を使用します。立方体を描画しているコードサンプルは、インターリーブされた頂点データを使用しています。構造体の配列とも呼ばれます。これは推奨されるレイアウトです。

データ形式をサポートするには、属性(sphere_modelVerts、sphere_modelNormals ...)ごとに個別のバッファーを作成し、オフセットなしで属性を定義するだけです。

于 2013-01-04T17:15:48.930 に答える