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
是的,它不工作= \我增加一个屏幕截图 – meriley 2012-04-14 01:45:01
嗯,不太确定。我试图猜测那些块上显示的是什么,但我无法确切地说,这对你来说看起来像什么?也许你的纹理加载功能出了问题。小心把整个绘图代码放在你的文章中? (只需将代码放在代码块中,最好附加IDE的屏幕截图) – Tim 2012-04-14 02:27:21
当然可以。纹理加载与我加载墙壁纹理的方式相同。但生病发布代码。 – meriley 2012-04-14 03:21:38