2010-11-29 17 views
1

私はOpenGL ES 1.0で遊び始めました。私はいくつかの(初心者の)問題にぶつかりました:三角で記述された立方体に正方形のテクスチャをマップしようとしました。今正方形のテクスチャを三角形にマッピングする

// Turn necessary features on 
    glEnable(GL_TEXTURE_2D); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_ONE, GL_SRC_COLOR); 
    glEnable(GL_CULL_FACE); 
    //glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 

    // Bind the number of textures we need, in this case one. 
    glGenTextures(1, &texture[0]); 
    glBindTexture(GL_TEXTURE_2D, texture[0]); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

//Drawing code 
static GLfloat rot = 0.0; 

static const Vertex3D vertices[] = { 
    -1.0f,-1.0f,-1.0f, //0 00 
    1.0f,-1.0f,-1.0f, //1 10 
    1.0f, 1.0f,-1.0f, //2 11 
    -1.0f, 1.0f,-1.0f, //3 01  
}; 


static const int vertexCnt = 3 * 2; 

static const GLubyte cube[] = { 
    3,0,2, 
    1,2,0, 
}; 

static const GLfloat texCoords[] = { 
    0,1, 
    0,0, 
    1,1, 
    1,0, 
    1,1, 
    0,0, 
}; 


glClearColor(0.0, 0.0, 0.0, 1.0); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glLoadIdentity(); 

glTranslatef(0.0f, 0.0f, -3.0f); 

glBindTexture(GL_TEXTURE_2D, texture[0]); 

glEnableClientState(GL_VERTEX_ARRAY); 
//glEnableClientState(GL_COLOR_ARRAY); 
glEnableClientState(GL_NORMAL_ARRAY); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glEnable(GL_COLOR_MATERIAL); 


glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 
glVertexPointer(3, GL_FLOAT, 0, vertices); 

//glColorPointer(4, GL_FLOAT, 0, colors); 
glNormalPointer(GL_FLOAT, 0, normals); 



glDrawElements(GL_TRIANGLES, vertexCnt, GL_UNSIGNED_BYTE, cube); 


glDisableClientState(GL_VERTEX_ARRAY); 
//glDisableClientState(GL_COLOR_ARRAY); 
glDisableClientState(GL_NORMAL_ARRAY); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 

三角形に正方形のテクスチャをマッピングする際、膨大な数の試みの後、私はちょうどそれが他の側面のために働くことができません... はケースのための親指のいくつかのルールがありますか?

EDIT:マッピングをどのように行うべきかを考えます。しかし、この例(1つの顔)では動作しません。誰かが私が正しくマッピングしたかどうかを確認してください(他のコードが動作していると仮定して)?

感謝

+0

:ここ

キューブを表示するように更新あなたのコードである(I無効に顔を確認するために殺処分して、いくつかの巻線問題がある可能性があります)同じ頂点データを再利用しながらキューブを作成します。あなたのキューブを6個の別個のクワッド= 24個の頂点として8個の代わりに再加工します。 –

+0

'法線'配列が間違っていると思われます。通常のポインタの内容は何ですか?各顔の法線を変えていますか? –

+0

法線はちょっと間違っていますが、テクスチャマッピングに影響があるかどうかはわかりませんでした。照明にしか影響しないと思っていました。ありがとう – sinek

答えて

1

他のものと同じように、私はあなたのクワッドテクスチャを三角形にマッピングするトリックはないと思います。

あなたが経験している主な問題は、コーナーごとにテクスチャ座標の不連続性が原因です。 1つのコーナーがある面に対していくつかのUV座標(u、v)としてある場合、頂点を共有する他の2つの面に対して同じ値を持つことを意味するわけではありません。 (3面で共有される)キューブの各コーナーでUVが一意であり、4つのUV値({0,0}、{1,0}、{1,1}、 {0,1})が各面に存在するが、いくつかのテクスチャは完全に歪んでいる。 {1,1}が常に{0,0}の反対にあるとは限りません。

最も簡単な方法は明示的に6つの四角形を宣言することです。各四角形は2つの三角形で構成されています。合計24個の頂点(24個の位置と24個のテックスコード、インターリーブされているかどうか)と36個のインデックス(2つの三角形で構成される6つのクワッド、6 * 2 * 3 = 36)が得られます。私はきれいに四角をマッピングする方法はないと思う

glEnable(GL_TEXTURE_2D); 
glEnable(GL_BLEND); 
glEnable(GL_DEPTH_TEST); 
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 
glDisable(GL_CULL_FACE); 

static const float vertices[] = { 
     0.0f, 1.0f, 0.0f, 
     1.0f, 1.0f, 0.0f, 
     0.0f, 0.0f, 0.0f, 
     1.0f, 0.0f, 0.0f, 

     0.0f, 1.0f, 1.0f, 
     0.0f, 0.0f, 1.0f, 
     1.0f, 1.0f, 1.0f, 
     1.0f, 0.0f, 1.0f, 

     0.0f, 1.0f, 1.0f, 
     1.0f, 1.0f, 1.0f, 
     0.0f, 1.0f, 0.0f, 
     1.0f, 1.0f, 0.0f, 

     0.0f, 0.0f, 1.0f, 
     0.0f, 0.0f, 0.0f, 
     1.0f, 0.0f, 1.0f, 
     1.0f, 0.0f, 0.0f, 

     1.0f, 1.0f, 0.0f, 
     1.0f, 1.0f, 1.0f, 
     1.0f, 0.0f, 0.0f, 
     1.0f, 0.0f, 1.0f, 

     0.0f, 1.0f, 0.0f, 
     0.0f, 0.0f, 0.0f, 
     0.0f, 1.0f, 1.0f, 
     0.0f, 0.0f, 1.0f 
     }; 


static const int vertexCnt = 6 * 4; 

static const GLubyte cube[] = { 
    0, 1, 2, 1, 2, 3, 
    4, 5, 6, 5, 6, 7, 
    8, 9, 10, 9, 10, 11, 
    12, 13, 14, 13, 14, 15, 
    16, 17, 18, 17, 18, 19, 
    20, 21, 22, 21, 22, 23 
}; 

static const GLfloat texCoords[] = { 
    0.0f, 0.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, 
    0.0f, 1.0f, 

    0.0f, 0.0f, 
    1.0f, 0.0f, 
    0.0f, 1.0f, 
    1.0f, 1.0f, 

    0.0f, 1.0f, 
    0.0f, 0.0f, 
    1.0f, 1.0f, 
    1.0f, 0.0f, 

    0.0f, 0.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, 
    0.0f, 1.0f 
    }; 

glClearColor(0.0, 0.0, 0.0, 1.0); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

//glLoadIdentity(); 

//glTranslatef(0.0f, 0.0f, -3.0f); 
glRotatef(3.1415927f, 1.0f, 1.0f, 0.0f); 

glBindTexture(GL_TEXTURE_2D, spriteTexture); 

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 
glVertexPointer(3, GL_FLOAT, 0, vertices); 

glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, cube); 
+0

上記の例の座標を正しくマップすることを確認してください。 BTW。情報をありがとう! – sinek

+0

彼は今のところひとつの顔を描こうとしている。不連続は問題ではない。 –

+1

はい、質問が編集されました(キューブのために使用されました);-)マッピングが正しいように見えるので、画面に何も表示されなければ、フェイスカリングとGL_COLOR_MATERIALを無効にすることから始めます。 – Ozirus

1

私はあなたの頂点リストを通じて片にしようとしていないが、私の推測は、あなたの座標は完全に台無しにしてマッピングが間違っているということです、あなたは間違ってあなたのインデックスバッファのフォーマットを指定している、または裏面のカリングがオンになっていて、いくつかの頂点の順序が間違っています。

テクスチャ座標自体については、四角形と比較して三角形にマッピングするトリックはありません。 6つの頂点(1つの面につき2つの重複点)があるので、以前は4つのテクスチャ座標を持つ必要があったのは、6つのテクスチャ座標を持つだけです。キューブの場合と同様に、インデックスバッファを使用して重複を避けることができます。

潜在的な背面のカリングの問題は、毎回同じ順序で頂点を定義する必要があります。テクスチャが向く方向、または反時計回りのすべてに対して時計回りです。

OpenGLパイプラインを設定するためにどのようなコマンドを使用していますか、それらの頂点を描画するためにどのコマンドを使用していますか?質問に対応するコードを追加してください。

関連する問題