我已经对此进行了搜索,但不幸的是,我找到的唯一答案是那些处理未映射纹理问题的答案,在这种情况下,纹理已映射但看起来不像加载的表面。
无论如何,忽略不需要 2 个正方形图像的幂的事实(我还没有正确研究)我已经制作了一个功能脚本,用于将表面扩展到 2 维的幂和一个用于存储调整大小的结构表面、表面的旧尺寸和纹理的 ID。
我的表面纹理代码是(参数是 SDL_Surface* surf、antTex* tex):
tex->w=surf->w;
tex->h=surf->h;
tex->surf=resizeToNearestPow2(surf);
glGenTextures(1, &tex->id);
glBindTexture(GL_TEXTURE_2D, tex->id);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex->surf->w, tex->surf->h, 0, GL_BGRA, GL_UNSIGNED_BYTE, tex->surf->pixels);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glBindTexture(GL_TEXTURE_2D, NULL);
antTex 结构是:
GLuint id; //Texture ID
int w, h; //Original Image Size
int rw, rh; //Resized Canvas Size
SDL_Surface* surf; //Resized Surface
关于调整图像大小的一切似乎工作正常(使用 SDL 的 SDL_SaveBMP 函数检查生成的图像),我使用 SDL2_image.h 的 IMG_Load 加载原始图像。
当我在启用 GL_BLEND 的情况下绘制一个纹理映射到它的平面时,什么都没有显示,当我禁用它时,我得到了这个(红色是窗口的背景颜色):
http://i1200.photobucket.com/albums/bb336/DarknessXeagle/error_zps03e1e5a1.png
原图是这样的:
http://i1200.photobucket.com/albums/bb336/DarknessXeagle/d_zpsc8b9af6f.png
这是我绘制带有纹理的平面的函数(参数是 antTex* tex、int x、int y):
glBindTexture(GL_TEXTURE_2D, tex->id);
int w, h;
w=tex->w;
h=tex->h;
GLfloat tw, th;
th=(GLfloat)tex->h/(GLfloat)tex->rh;
tw=(GLfloat)tex->w/(GLfloat)tex->rw;
glPushMatrix();
glTranslatef(x, y, 0);
glBegin(GL_QUADS);
glNormal3f(0, 0, 1);
glTexCoord2f(0, th); glVertex2f(0, h);
glTexCoord2f(tw, th); glVertex2f(w, h);
glTexCoord2f(tw, 0); glVertex2f(w, 0);
glTexCoord2f(0, 0); glVertex2f(0, 0);
glEnd();
glPopMatrix();
glBindTexture(GL_TEXTURE_2D, NULL);