【发布时间】:2011-08-25 12:12:38
【问题描述】:
我正在尝试将简单的纹理 (64x64) 渲染为 64x64 四边形。四边形本身正在渲染,但不是纹理。 (它正在渲染一个空白的白色 64x64 四边形。)
我正在使用SOIL 加载图像。
static GLuint LoadPNG(char* filename)
{
GLuint texture = SOIL_load_OGL_texture
(
filename,
SOIL_LOAD_AUTO,
SOIL_CREATE_NEW_ID,
SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT
);
if (texture == 0)
Log("Texture Load Error: " + string(filename));
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
return texture;
}
这是我的渲染代码,我可能没有正确映射它,所以这也可能是问题。
// Draw Textured Quad
static void glDrawTexturedQuad(glRectF rect, GLuint tex)
{
// Bind Texture
glBindTexture (GL_TEXTURE_2D, tex);
// Render Settings
glEnable(GL_TEXTURE_2D);
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glColor3ub(255,255,255);
glBegin(GL_QUADS);
// Top Left
glTexCoord2f(0, 1);
glVertex2f(rect.X, rect.Y);
// Top Right
glTexCoord2f(1, 1);
glVertex2f(rect.X + rect.Width, rect.Y);
// Bottom Right
glTexCoord2f(1, 0);
glVertex2f(rect.X + rect.Width, rect.Y + rect.Height);
// Bottom Left
glTexCoord2f(0, 0);
glVertex2f(rect.X, rect.Y + rect.Height);
glEnd();
}
这是其余的相关代码。 (这实际上只是临时代码,为了将它们粘合在一起进行测试,我会在它工作后提出更好的解决方案。)
static GLuint Texture;
static void LoadTextures()
{
Texture = LoadPNG("filename");
}
static void glRenderTest()
{
glRectF rect = {20, 20, 64, 64};
glDrawTexturedQuad(rect, Texture);
}
我也遵循了here 找到的所有建议它仍然没有显示我的纹理。
我将 LodePNG 换成了 SOIL(简单的 OpenGL 图像库),它更易于使用,但仍然无法正常工作。
我按照以下答案中的建议添加了 glTexEnv,但我仍然只是得到一个白框,我会尝试更多设置,但我认为不是这样。 (编辑:尝试了各种标志,什么都没有,仍然只是一个白色的四边形。)
【问题讨论】:
-
hm.. 我已经与相应的 nehe 教程 (nehe.gamedev.net/data/lessons/lesson.asp?lesson=06) 进行了交叉检查,但在 OpenGL 调用中我找不到任何尴尬的地方。你确定,图片加载功能正常吗?
-
要验证 Constantinius,自动生成棋盘往往是最简单的事情。例如。 for(every x){ for(every y) { color = ((x^y)&8) ?黑,白; } }
-
嗯,我的错误处理看起来是正确的,它也不会呈现棋盘格,但是,我也可能做错了,我基本上是复制粘贴它以快速完成。 //csc.villanova.edu/~mdamian/graphics/notes/GLTextures/…
-
我的四边形会不会倒退,我正在破解一个游戏,所以我不知道它使用的是哪种世界系统,也许将四边形翻转过来?
-
如果你说你可以看到你的四边形,但只是没有纹理,我猜这不会改变任何事情。顺便说一句,你的意思是背面剔除,你可以通过输入
glDisable(GL_CULL_FACE);来关闭它。
标签: c++ c opengl texture-mapping