2017-10-27 15 views
1

テクスチャアトラスの異なる領域を、土壌を使ってキューブの異なる辺にマップしたいとします。土壌を使ってテクスチャアトラスからOpenGLで領域を取得する

glEnable(GL_TEXTURE_2D); 
texID = LoadTexture("sas.jpg"); 
glBindTexture(GL_TEXTURE_2D, texID); 

しかし、私の質問は、私は一つだけのスプライトを得るのですかです:

int LoadTexture(const char*); 

int texID; 

void DrawCube(float width) 
{ 
    float wd2 = width/2; 
    glColor3f(0, 0, 1); 
    glBegin(GL_QUADS); 

    //front 
    glTexCoord2f(0, 1); 
    glVertex3f(-wd2, -wd2, wd2); 
    glTexCoord2f(1, 1); 
    glVertex3f(wd2, -wd2, wd2); 
    glTexCoord2f(1, 0); 

    glVertex3f(wd2, wd2, wd2); 
    glTexCoord2f(0, 0); 

    glVertex3f(-wd2, wd2, wd2); 

    //left side.. 
    //right side.. 
    //back.. 
    //top.. 
    //bottom.. 

    glEnd(); 
} 

int LoadTexture(const char* tex) { 
    texID = SOIL_load_OGL_texture(tex, 4, 0, 0); 
    if (!texID) { 
     cout << "Texture not loaded!\n"; 

    } 
    return texID; 
} 

そしてinit機能に:これまでのところ、私は、立方体の辺の一つに単一の画像をマッピングするために管理します全体のテクスチャの?ここ

画像である:

image
+1

座標:例えば'' glTexCoord2f(2.0/8.0,2.0/4.0) '' glTexCoord2f(3.0/8.0,2.0/4.0) '' glTexCoord2f(3.0/8.0,1.0/4.0) ''、 '' glTexCoord2f(2.0/8.0,1.0/4.0) ); '2行目の3番目のタイルを返します – Rabbid76

+0

しかし、どのように分数を計算しますか?つまり、第1行目の2番目のタイルが必要な場合、どのようにglTexCoord2fのパラメータを知ることができますか? – yooo123

答えて

0

テクスチャ座標は、テクスチャ画像における点にジオメトリの頂点(ポイント)マップ。これにより、テクスチャのどの部分がジオメトリの特定の部分に配置され、テクスチャパラメータ(glTexParameterを参照)と共にジオメトリがテクスチャによってどのようにラップされるかが指定されます。
一般に、テクスチャの左下の点はテクスチャ座標(0,0)によってアドレス指定され、テクスチャの右上の点は(1,1)によってアドレス指定されます。

テクスチャは8列4列のタイルで構成されています。テクスチャの1つのタイルをクワッドに配置するには、テクスチャ座標を同じ方法で分割する必要があります。単一のタイルのコーナーは、次のように対処されています

float tiles_U = 8.0f; 
float tiles_V = 4.0f; 
float index_U = .... ; // index of the column in [0, tiles_U-1]; 
float index_V = .... ; // index of the row in [0, tiles_V-1]; 

float left_U = index_U  /tiles_U; 
float right_U = (index_U+1.0f)/tiles_U; 

float top_V = (tiles_V - index_V)  /tiles_V; 
float bottom_V = (tiles_V - index_V - 1.0f)/tiles_V; 

このようなあなたのコードにそれを適用します。あなたはテクスチャをスケーリングとシフトする必要が

float wd2 = width/2; 
glColor3f(0, 0, 1); 
glBegin(GL_QUADS); 

glTexCoord2f(left_U, top_V); 
glVertex3f(-wd2, -wd2, wd2); 

glTexCoord2f(right_U, top_V); 
glVertex3f(wd2, -wd2, wd2); 

glTexCoord2f(right_U, bottom_V); 
glVertex3f(wd2, wd2, wd2); 

glTexCoord2f(left_U, bottom_V); 
glVertex3f(-wd2, wd2, wd2); 

glEnd(); 
関連する問題