2012-04-13 110 views
0

我的问题可能很简单回答Glut和使用纹理图谱

Im导入128x128纹理图集RAW文件。我想让我的立方体的一个面部存储在该纹理图集中的图像。我画了尺寸的图像10x5开始像素(10,5)

所以我的形象在左上角代表(10,5)和右下角(20,10)

图片角落看这样

(10,5) - - - - (20,5)

(20,5) - - - - (20,10)

如果我正确读取

glTexCoord 2f()在执行时将整个图像从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

回答

1

我只选择我要画,并通过128除以它的像素?

是的。这不适合你吗?似乎你知道该怎么做,不知道你为什么不试试它:)

+0

是的,它不工作= \我增加一个屏幕截图 – meriley 2012-04-14 01:45:01

+0

嗯,不太确定。我试图猜测那些块上显示的是什么,但我无法确切地说,这对你来说看起来像什么?也许你的纹理加载功能出了问题。小心把整个绘图代码放在你的文章中? (只需将代码放在代码块中,最好附加IDE的屏幕截图) – Tim 2012-04-14 02:27:21

+0

当然可以。纹理加载与我加载墙壁纹理的方式相同。但生病发布代码。 – meriley 2012-04-14 03:21:38