2012-03-15 9 views
0

"n"個のテクスチャ(例では6個)で任意のオブジェクトを描画しようとしています。VBLを使用してOpenGLでGL_TEXTURE_2D_ARRAYを使用する方法

単一のテクスチャを使用する場合、すべて正常に動作しますが、2Dテクスチャアレイを機能させるのは難しいです。 「R」パラメータが(私はその特定のクワッドにしたいテクスチャのインデックスを示す)は、各クワッドに対して異なること

struct Vertex3f { float x, y, z; }; 
struct ObjectVertexfMT { // MT stands for Multi Texture 
    struct Vertex3f coord; 
    struct Vertex3f texcoord; 
    struct Vertex3f normal; 
}; 
struct ObjectVertexfMT GLEngine_CubeMT[] = { 
    // x,  y,  v, u, v, r, nx, ny, nz 
    // Front 
    { -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }, 
    { 1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }, 
    { 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f }, 
    { -1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f }, 
    // Back 
    { -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, -1.0f }, 
    { 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, -1.0f }, 
    { 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, -1.0f }, 
    { -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, -1.0f }, 
    // Top 
    { -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 2.0f, 0.0f, 1.0f, 0.0f }, 
    { -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 2.0f, 0.0f, 1.0f, 0.0f }, 
    { 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 2.0f, 0.0f, 1.0f, 0.0f }, 
    { 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 2.0f, 0.0f, 1.0f, 0.0f }, 
    // Bottom 
    { -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 3.0f, 0.0f, -1.0f, 0.0f }, 
    { -1.0f, -1.0f, 1.0f, 0.0f, 1.0f, 3.0f, 0.0f, -1.0f, 0.0f }, 
    { 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 3.0f, 0.0f, -1.0f, 0.0f }, 
    { 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 3.0f, 0.0f, -1.0f, 0.0f }, 
    // Right 
    { 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 4.0f, 1.0f, 0.0f, 0.0f }, 
    { 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 4.0f, 1.0f, 0.0f, 0.0f }, 
    { 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 4.0f, 1.0f, 0.0f, 0.0f }, 
    { 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 4.0f, 1.0f, 0.0f, 0.0f }, 
    // Left 
    { -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 5.0f, -1.0f, 0.0f, 0.0f }, 
    { -1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 5.0f, -1.0f, 0.0f, 0.0f }, 
    { -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 5.0f, -1.0f, 0.0f, 0.0f }, 
    { -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 5.0f, -1.0f, 0.0f, 0.0f } 
}; 

注:

はここでオブジェクトです。

struct texInfo { 
    int width, height; 
    unsigned char *data; 
}; 

// Loads texture from filename in a texInfo structure -- always 32 bit depth 
struct texInfo *loadTexture(const char* filename); 

unsigned int register3DTexture(const char *filenames[], unsigned int texcount) { 
    unsigned int ret; 
    unsigned int i; 
    struct texInfo *tex; 
    glGenTextures(1, &ret); 
    glBindTexture(GL_TEXTURE_2D_ARRAY, ret); 
    glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, 4, 256, 256, 6, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 
    for (i = 0; i < texcount; i++) { 
    tex = loadTexture(filenames[i]); 
    glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, i, tex->width, tex->height, 1, GL_RGBA, GL_UNSIGNED_BYTE, tex->data); 
    free(tex); 
    } 

    return(ret); 
} 

を...そして私が描く::

は、私はそうのような質感を登録してい

glPushMatrix(); 

    glClientActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D_ARRAY, textures[0]); // Same behaviour if I change to GL_TEXTURE_2D 

    glTranslatef(pos.x, pos.y, pos.z); 
    glRotatef(rot_angle, rot.x, rot.y, rot.z); 

    glBindBuffer(GL_ARRAY_BUFFER, VobObject[0]); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VobObject[1]); 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_NORMAL_ARRAY); 

    glVertexPointer(3, GL_FLOAT, sizeof(struct ObjectVertexfMT), 0); 
    glNormalPointer(GL_FLOAT, sizeof(struct ObjectVertexfMT), (void*)(sizeof(float) * 6)); 

    // Textures 
    glClientActiveTexture(GL_TEXTURE0); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
    glTexCoordPointer(2, GL_FLOAT, sizeof(struct ObjectVertexfMT), (void*)(sizeof(float) * 3)); 

    glDrawElements(GL_QUADS, m_vertexcount, GL_UNSIGNED_SHORT, 0); 

    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_NORMAL_ARRAY); 
    glPopMatrix(); 

オブジェクトが正しく描画され、ない質感を持ちます。

別のいくつかの質問:

  • は、それが動作すると仮定すると、これが私の目標を達成するための最良の方法ですか?

  • は「subtexturesは」(glTexImage3D()の幅と高さの パラメータがglTexSubImage3D()からのものと 異なる場合があります)、「メイン」質感の異なる寸法を持つことができますか?

答えて

1

配列テクスチャを使用するには、シェーダを使用する必要があります。固定機能レンダリングでは使用できません。

は「subtexturesは」(glTexImage3Dの幅と高さのパラメータ()glTexSubImage3Dからのものとは異なる場合があります())「メイン」質感の異なる寸法を持つことができますか?

この質問は混乱します。 C++配列と同様に、テクスチャ配列の要素はすべて同じです。 C++でint[30]の配列を持つ場合、すべての要素は30の整数になります。配列テクスチャについても同じことが言えます。 2D配列のテクスチャ全体の幅と高さは、配列のすべてのテクスチャで同じです。

glTexSubImage3D(および同様の機能)ではなく、はテクスチャの寸法に影響します。ピクセルデータをテクスチャのある場所にアップロードするだけです。 glTexImage3D(および同様の機能)のみがテクスチャの寸法に影響します。

+0

だから、GLOTEXTURE_2D_ARRAYでVBOを使用することはできません。今度は、シェーダのチュートリアルが必要になります。 –

+0

@SergioMoura:バッファオブジェクトとシェーダは、お互いに何もしません。固定機能レンダリングでバッファオブジェクトを使用することができます。クライアントサイドの頂点配列でシェーダを使用できます。それらが相互作用する*唯一の時間は、さまざまなシェーダ関連アクティビティ(属性、ユニフォーム、フィードバックの変換など)のソースデータとしてバッファオブジェクトを使用しているときです。 –

関連する問題