0

私の質問はおそらく答えるのはかなり簡単です

128x128テクスチャアトラスRAWファイルをインポートしています。立方体の面の1つを、そのテクスチャアトラスに保存されている画像にします。ピクセル(10、5)から始まる10x5のサイズで画像を描画しました

したがって、私の画像は左上隅(10、5)と右下隅(20、10)に表示されます。

画像コーナーはこんな感じ

(10、5)-----(20、5)

(20、5)-----(20、10)

正しく読めば

glTexCoord2f()は、実装時に画像全体を0から1までスケーリングします。そのテクスチャアトラスでサブイメージを取得したい場合、描画したいピクセルを選択して128で除算しますか?

GLuint textAtlas = LoadTextureRAW("TextAtlas128", 1, 128,128 );

glPushAttrib(GL_ENABLE_BIT);
    glEnable( GL_TEXTURE_2D );
    glBindTexture( GL_TEXTURE_2D, textAtlas );
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
    glPushMatrix();
        glBegin(GL_QUADS);
.
.
.

glTexCoord2f(10.0f/128, 05.0f/128); glVertex3d(...

glTexCoord2f(10.0f/128, 10.0f/128); glVertex3d(...

glTexCoord2f(20.0f/128, 10.0f/128); glVertex3d(...

glTexCoord2f(20.0f/128, 05.0f/128); glVertex3d(...

どんな助けでも素晴らしいでしょう。

void drawBlocks(){
    float percentage = .3;
    int i , j ,k;
    int sX = -80; int sY = 90; int sZ = -620;
    GLuint textAtlas = LoadTextureRAW("TextAtlas128", 1, 128,128 );

    glPushAttrib(GL_ENABLE_BIT);
        glEnable( GL_TEXTURE_2D );
        glBindTexture( GL_TEXTURE_2D, textAtlas );
        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
        glPushMatrix();
            glBegin(GL_QUADS);
                for(i = 0; i < 4; i++){
                    for(j = 0; j < 8; j++){
                        for(k = 0; k < 9; k++){
                            if(block[i][j][k].exists == 1){
                                //Front Face
                                glNormal3f(0,0,1);
                                glTexCoord2f(10.0/128, 05.0/128); glVertex3d( sX + (i * 40)      , sY - (j * 20)     , sZ - (k * 20));
                                glTexCoord2f(10.0/128, 10.0/128); glVertex3d( sX + (i * 40)      , sY - (j * 20) -20 , sZ - (k * 20));
                                glTexCoord2f(20.0/128, 10.0/128); glVertex3d( sX + (i * 40) + 40 , sY - (j * 20) -20 , sZ - (k * 20));
                                glTexCoord2f(20.0/128, 05.0/128); glVertex3d( sX + (i * 40) + 40 , sY - (j * 20)     , sZ - (k * 20));


                                //Back Face
                                glVertex3d( sX + (i * 40)      , sY - (j * 20)     , sZ - (k * 20) - 20);
                                glVertex3d( sX + (i * 40)      , sY - (j * 20) -20 , sZ - (k * 20) - 20);
                                glVertex3d( sX + (i * 40) + 40 , sY - (j * 20) -20 , sZ - (k * 20) - 20);
                                glVertex3d( sX + (i * 40) + 40 , sY - (j * 20)     , sZ - (k * 20) - 20);

                                //Top Face
                                glVertex3d( sX + (i * 40)      , sY - (j * 20)  , sZ - (k * 20) - 20);
                                glVertex3d( sX + (i * 40)      , sY - (j * 20)  , sZ - (k * 20)     );
                                glVertex3d( sX + (i * 40) + 40 , sY - (j * 20)  , sZ - (k * 20)     );
                                glVertex3d( sX + (i * 40) + 40 , sY - (j * 20)  , sZ - (k * 20) - 20);

                                //Bottom Face
                                glVertex3d( sX + (i * 40)      , sY - (j * 20) - 20 , sZ - (k * 20) - 20);
                                glVertex3d( sX + (i * 40)      , sY - (j * 20) - 20 , sZ - (k * 20)     );
                                glVertex3d( sX + (i * 40) + 40 , sY - (j * 20) - 20 , sZ - (k * 20)     );
                                glVertex3d( sX + (i * 40) + 40 , sY - (j * 20) - 20 , sZ - (k * 20) - 20);

                                //Right Face
                                glVertex3d( sX + (i * 40) + 40 , sY - (j * 20)      , sZ - (k * 20)     );
                                glVertex3d( sX + (i * 40) + 40 , sY - (j * 20) - 20 , sZ - (k * 20)     );
                                glVertex3d( sX + (i * 40) + 40 , sY - (j * 20) - 20 , sZ - (k * 20) - 20);
                                glVertex3d( sX + (i * 40) + 40 , sY - (j * 20)      , sZ - (k * 20) - 20);

                                //Left Face
                                glVertex3d( sX + (i * 40) , sY - (j * 20)      , sZ - (k * 20)     );
                                glVertex3d( sX + (i * 40) , sY - (j * 20) - 20 , sZ - (k * 20)     );
                                glVertex3d( sX + (i * 40) , sY - (j * 20) - 20 , sZ - (k * 20) - 20);
                                glVertex3d( sX + (i * 40) , sY - (j * 20)      , sZ - (k * 20) - 20);
                            }
                        }
                    }
                }
            glEnd();
        glPopMatrix();
    glPopAttrib();
}

void drawPlanes(){
    /*GLuint texture  =  LoadTextureRAW( "Wall Texture", 1 );*/
    GLuint texture  =  LoadTextureRAW( "walls", 1, 32,32 );

    glPushAttrib(GL_ENABLE_BIT);
        glEnable( GL_TEXTURE_2D );
        glBindTexture( GL_TEXTURE_2D, texture );
        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);


        glBegin(GL_QUADS);
            //Floor
            glNormal3f( 0.0f , 1.0f, 0.0f);

            glTexCoord2f(0.0f, 0.0f);   glVertex3f( -100.0f , -100.0f , -725.0f);
            glTexCoord2f(0.0f, 10.0f);  glVertex3f(100.0f , -100.0f , -725.0f);
            glTexCoord2f(10.0f, 10.0f); glVertex3f(100.0f , -100.0f ,  000.0f);
            glTexCoord2f(10.0f, 0.0f);  glVertex3f( -100.0f , -100.0f ,  000.0f);

            //Ceiling
            glNormal3f(0.0f,-1.0f,0.0f);

            glTexCoord2f(0.0f, 0.0f);   glVertex3f( 100.0f, 100.0f, -725.0f);
            glTexCoord2f(0.0f, 10.0f);  glVertex3f(-100.0f, 100.0f, -725.0f);
            glTexCoord2f(10.0f, 10.0f); glVertex3f(-100.0f, 100.0f,  000.0f);
            glTexCoord2f(10.0f, 0.0f);  glVertex3f( 100.0f, 100.0f,  000.0f);

            //Right Wall
            glNormal3f( -1.0f , 0.0f, 0.0f);

            glTexCoord2f(10.0f, 10.0f); glVertex3f(100.0f , 100.0f ,  000.0f);
            glTexCoord2f(0.0f, 10.0f);  glVertex3f(100.0f , 100.0f , -725.0f);
            glTexCoord2f(0.0f, 00.0f);  glVertex3f(100.0f ,-100.0f , -725.0f);
            glTexCoord2f(10.0f, 0.0f);  glVertex3f(100.0f ,-100.0f,   000.0f);

            //LeftWall
            glNormal3f( 1.0f , 0.0f, 0.0f);

            glTexCoord2f(10.0f, 10.0f); glVertex3f(-100.0f ,  100.0f , -725.0f);
            glTexCoord2f(0.0f, 10.0f);  glVertex3f(-100.0f ,  100.0f ,  000.0f);
            glTexCoord2f(0.0f, 00.0f);  glVertex3f(-100.0f , -100.0f ,  000.0f);
            glTexCoord2f(10.0f, 0.0f);  glVertex3f(-100.0f , -100.0f , -725.0f);

            //Back Wall
            glNormal3f( 0.0f , 0.0f, 1.0f);

            glTexCoord2f(10.0f, 10.0f); glVertex3f( 100.0f ,  100.0f , -725.0f);
            glTexCoord2f(0.0f, 10.0f);  glVertex3f(-100.0f ,  100.0f , -725.0f);
            glTexCoord2f(0.0f, 00.0f);  glVertex3f(-100.0f , -100.0f , -725.0f);
            glTexCoord2f(10.0f, 0.0f);  glVertex3f( 100.0f , -100.0f , -725.0f);


        glEnd();
    glPopAttrib();

}
/**
    Done Drawing Stuff
*/

/**
    Texture Stuff
*/

// load a 256x256 RGB .RAW file as a texture
GLuint LoadTextureRAW( const char * filename, int wrap , int width, int height )
{
    GLuint texture;
    GLbyte *data;
    FILE * file;

    // open texture data
    file = fopen( filename, "rb" );
    if ( file == NULL ) {
        printf("Not found");
        return 0;
    }

    data = (GLbyte*)malloc(width * height * 3);

    // read texture data
    fread( data, width * height * 3, 1, file );
    fclose( file );

    // allocate a texture name
    glGenTextures( 1, &texture );

    // select our current texture
    glBindTexture( GL_TEXTURE_2D, texture );

    // select modulate to mix texture with color for shading
    glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );

    // when texture area is small, bilinear filter the closest mipmap
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
                     GL_LINEAR_MIPMAP_NEAREST );
    // when texture area is large, bilinear filter the first mipmap
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

    // if wrap is true, the texture wraps over at the edges (repeat)
    //       ... false, the texture ends at the edges (clamp)
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
                     wrap ? GL_REPEAT : GL_CLAMP );
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
                     wrap ? GL_REPEAT : GL_CLAMP );

    // build our texture mipmaps
    gluBuild2DMipmaps( GL_TEXTURE_2D, 3, width, height,
                       GL_RGB, GL_UNSIGNED_BYTE, data );

    // free buffer
    free( data );

    return texture;
}

編集:スクリーンショット

http://dl.dropbox.com/u/12914798/Texture%20Atlas.png

http://dl.dropbox.com/u/12914798/ingame.png

http://dl.dropbox.com/u/12914798/Code%20Example.png

4

1 に答える 1

1

描きたいピクセルを選んで128で割るだけでいいのでしょうか?

うん。それはあなたのために働いていませんか?あなたは何をすべきか知っているようですが、なぜあなたがそれを試しなかったのかわかりません:)

于 2012-04-14T00:19:33.800 に答える