OpenGL – 2D纹理映射

我正在尝试将简单的纹理(64×64)渲染为64×64四边形。 四边形本身是渲染,但不是纹理。 (它呈现一个空白的64×64四边形。)

我正在使用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); } 

我也遵循了这里找到的所有建议它仍然没有显示我的纹理。


我将LodePNG替换为SOIL(简单的OpenGL图像库),它更容易使用,但仍然无法正常工作。

我按照下面的答案中的建议添加了glTexEnv,但我仍然只是得到一个白色的盒子,我会尝试更多的设置,但我不认为那是它。 (编辑:尝试了各种标志,没有,只是一个白色四边形。)

你试过打电话吗?

 glEnable(GL_TEXTURE_2D); glBindTexture (GL_TEXTURE_2D, texture); 

之前

 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

所有这些都在同一个文件中吗?

 static GLuint Texture; static void LoadTextures() { Texture = LoadPNG("filename"); } static void glRenderTest() { glRectF rect = {20, 20, 64, 64}; glDrawTexturedQuad(rect, Texture); } 

如果它们不在同一个文件中,那么static变量将在每个编译单元中具有独立的副本,在程序启动时单独初始化为零。 这可以解释为什么你在加载器返回1后绑定纹理#0。

尝试使用gDEBugger gDEBugger 。 它将让您看到已加载到OpenGL中的所有纹理,并提供其他调试工具。

我没有看到你设置纹理function。 尝试在几何绘图函数中的glBindTexture之后添加:

 glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE ); // texture function: GL_DECAL, GL_MODULATE, etc. 

尝试不同的纹理function以满足您的需求:GL_DECAL,GL_BLEND,GL_MODULATE等。