3

私はポイントにまっすぐに行きます:

頂点の構造を作成しました。

struct Vertex3D
{
    Vector3D position;
    Vector2D textureCoordinate;
    Vector3D normal;
}

次に、特定の *.dae ファイルをインポートして、Vertex3D 構造化頂点のリストから構築された OpenGL Vertex Buffer にバインドします。すべてうまくいき、メッシュがインポートされて表示されます。シェーダーで操作できますが、問題があります。

また、テクスチャをロードして割り当てることも行います。その後、私はこの方法でそれを表示しようとしています:

glEnableVertexAttribArray(0);
glEnableVertexAttribArray(8);
glEnableVertexAttribArray(2);

glBindBuffer(GL_ARRAY_BUFFER, this->_entries[i].VB);
glVertexAttribPointer(0,3, GL_FLOAT, GL_FALSE, sizeof(RomCommon::Vertex3D), 0); // Vertices
glVertexAttribPointer(8,2, GL_FLOAT, GL_FALSE, sizeof(RomCommon::Vertex3D), (const GLvoid*)sizeof(RomCommon::Vector3D)); // Supposed texture position
glVertexAttribPointer(2,3, GL_FLOAT, GL_FALSE, sizeof(RomCommon::Vertex3D),  (const GLvoid*)(sizeof(RomCommon::Vector2D) + sizeof(RomCommon::Vector3D))); // Supposed normal position
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->_entries[i].IB);
glBindTexture(GL_TEXTURE_2D, 3);
glDrawElements(GL_TRIANGLES, this->_entries[i]._indexCount, GL_UNSIGNED_INT, 0);

glDisableVertexAttribArray(0);
glDisableVertexAttribArray(8);
glDisableVertexAttribArray(2);

私の問題は、テクスチャが表示されないことです。テクスチャの最初のピクセルの色のみが割り当てられます (私の場合は青です)。gDEBugger を使用してプロセス全体をデバッグしましたが、VertexBuffer が正しく設定されているように見え、テクスチャの画像が正しく読み込まれていることがわかりますが、表示されません。

デバッグのさまざまな側面を検索して試してみました。これには次のものが含まれます。

  • glEnable(GL_TEXTURE_2D) が設定されていることを確認します。
  • glEnable(GL_LIGHTING) と glDisable(GL_LIGHTING) を追加します。
  • glDisable(GL_DEPTH_TEST) を使用する; glDisable(GL_BLEND); glDisable(GL_SCISSOR_TEST); テクスチャをバインドする前に
  • エラーの取得
  • 奇妙なメッセージを探しています
  • メモリ内の頂点バッファをダブル チェックします (文字通り要素を調べて、*.dae ファイルの内容を相互比較します)。

編集

これでCGシェーダーを使用しています。頂点プログラムは次のとおりです。

struct vsOutput {


 float4 position : POSITION;
  float2 texCoord : TEXCOORD0;
  float3 color    : COLOR;
};

vsOutput VS_Main(      float4 position : POSITION,
                           float2 texCoord : TEXCOORD0,
                           float3 color    : COLOR,
                           uniform float4x4 ModelViewProj
                           )
{
  vsOutput OUT;

  OUT.position = mul(ModelViewProj, position);
  OUT.texCoord = texCoord;
  OUT.color = color;

  return OUT;   
}

そしてフラグメントプログラム:

struct fsOutput {
  float4 color : COLOR;
};

fsOutput FS_Main(
    float2 texCoord : TEXCOORD0,
    uniform sampler2D decal : TEX0
)
{ 
    fsOutput OUT;
    OUT.color = tex2D(decal,texCoord);
    return OUT;
}

必要に応じてプロジェクトの詳細を追加できますが、追跡したところ、問題は頂点バッファーのレンダリングのどこかにあるようです。

編集

また、CG を使用しているため、vertexAttribPointers が異なる必要があることもわかりました (8 は TEXCOORD0 用です)。それに基づいて一般的な説明を変更しました。

ソリューション編集

問題を別の視点から見て、実際にもう少し読むように私の心を開いてくれたコメントの数人のチャップに感謝します。解決策は次のとおりです。

    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(8);
    glEnableVertexAttribArray(2);

    glBindBuffer(GL_ARRAY_BUFFER, this->_entries[i].VB);
    glVertexAttribPointer(0,3, GL_FLOAT, GL_FALSE, sizeof(RomCommon::Vertex3D), 0); // Vertices
    glVertexAttribPointer(8,2, GL_FLOAT, GL_FALSE, sizeof(RomCommon::Vertex3D), (const GLvoid*)sizeof(RomCommon::Vector3D)); // Supposed texture position
    glVertexAttribPointer(2,3, GL_FLOAT, GL_FALSE, sizeof(RomCommon::Vertex3D),  (const GLvoid*)(sizeof(RomCommon::Vector2D) + sizeof(RomCommon::Vector3D))); // Supposed normal position
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->_entries[i].IB);


/* Solution start */
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glTexCoordPointer(2, GL_FLOAT, sizeof(RomCommon::Vertex3D), (const GLvoid*)12);
        glBindTexture(GL_TEXTURE_2D, 3);
        glDrawElements(GL_TRIANGLES, this->_entries[i]._indexCount, GL_UNSIGNED_INT, 0);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
/* Solution end */


    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(8);
    glDisableVertexAttribArray(2);

私の問題は、テクスチャ座標をシェーダーに渡すだけで、それを OpenGL ステート マシンにプッシュしなかったことです (それが適切な表現である場合)。これは、私が GLSL シェーダーではなく CG シェーダーを使用しているという事実と関係があると思いますが、間違っている可能性もあります。コードは、私が読んだいくつかの例と説明に大まかに基づいていますが、それらはすべて GLSL シェーダーに基づいており、機能していたため、断念しました。とにかく、それは今解決されました。

4

1 に答える 1

1
glBindTexture(GL_TEXTURE_2D, 3);

OpenGL でテクスチャ オブジェクト ID を強制することには注意が必要です。技術的には動作するはずglGenTextures()ですが、テクスチャ ID を取得するために使用する方が良い考えです。

于 2013-01-29T15:46:30.030 に答える