私の質問はおそらく答えるのはかなり簡単です
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