【问题标题】:Why can I not load a texture into my app?为什么我不能将纹理加载到我的应用程序中?
【发布时间】:2012-05-28 17:41:10
【问题描述】:

我认为纹理映射是一项非常简单的任务。实际上,我实施了很多次,但这次失败了,不知道为什么?而且我可以保证加载纹理的路径是正确的。我的困惑还有其他原因吗?

这是我的代码:

GLuint mytexture;
// two functions below come from NeHe's tut. I think it works well.
AUX_RGBImageRec *LoadBMP(CHAR *Filename)                
{
    FILE *File=NULL;                                    
if (!Filename)                                      
{
    return NULL;                                    
}
File=fopen(Filename,"r");                           
if (File)                                           
{
    fclose(File);                                   
    return auxDIBImageLoadA(Filename);              
}
return NULL;                                        
}

int LoadGLTextures()                                    
{
int Status=FALSE;                                   
AUX_RGBImageRec *TextureImage[1];                   
memset(TextureImage,0,sizeof(void *)*1);            

if (TextureImage[0]=LoadBMP("NeHe.bmp"))
{
    Status=TRUE;                                    
    glGenTextures(1, &mytexture);                   
    glBindTexture(GL_TEXTURE_2D, mytexture);
        glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, 
        GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
}

if (TextureImage[0])                                
{
    if (TextureImage[0]->data)                      
    {
        free(TextureImage[0]->data);                
    }

    free(TextureImage[0]);                          
}
return Status;                                      
}

//next is my Init() code:
bool DemoInit( void )
{
if (!LoadGLTextures())                          
{
    return FALSE;                                   
}
glEnable(GL_TEXTURE_2D);
........//other init is ok
}

bool DemoRender()
{
...///render other things
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, mytexture);
glColor3f(0,0,1);
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex2f(0, 0);
glTexCoord2f(1, 0); glVertex2f(200, 0);
glTexCoord2f(1, 1); glVertex2f(200, 200);
glTexCoord2f(0, 1); glVertex2f(0, 200);
glEnd();
glDisable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, 0);
}

很清楚,哈?但是,最终结果只有一个没有纹理的蓝色矩形。谁能给我一个提示?

【问题讨论】:

  • 没有什么不正确的。您是否在初始化后尝试过 glGetError ,并且在每个渲染循环后尝试过一次?
  • 请停止使用 GLAUX。使用真实的image loading library.
  • 致 Tim:是的,我使用 glGetError,结果为 0。顺便说一下,我直接使用 glDrawPixels 渲染 TextureImage[0],而不是纹理。我可以从特定角度看到图片。也许它证明加载过程是可以的。但我认为我需要质感。
  • 致 Nicol Bolas:好的,我会尝试另一种加载图像的方法。但实际上,我可以使用 glDrawPixels 来获取图像。所以我认为问题可能不在于 GLAUX。
  • @TonyLic:好吧,GLAUX 可能对你有用,但它已经过时了,它的腐烂气味甚至从它所在的存储介质中逸出;)使用 DevIL 怎么样?

标签: opengl textures texture-mapping texture2d


【解决方案1】:

假设TextureImage[0]->data 已正确填充:

但是,最终结果只有一个没有纹理的蓝色矩形。

您正在使用默认的GL_MODULATE 纹理环境。将glColor3f(0,0,1) 切换为glColor3f(1,1,1) 或使用GL_DECAL

您也可以尝试使用glPixelStorei(GL_UNPACK_ALIGNMENT, 1) before your glTexImage2D(),因为您将GL_RGB 用于格式

【讨论】:

  • 谢谢大家。我发现问题是我在加载纹理之前设置了 GL_LINE 模式,但我没有注意到这一点。真的傻哈?但同样感谢你们的出色建议!我想我学到了一些东西!
【解决方案2】:

问题是我在加载纹理之前设置了 GL_LINE 模式,但我没有注意到这一点。所以我设置了GL_FILL模式后,一切都很好!!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    • 2010-12-14
    • 2011-10-24
    • 1970-01-01
    • 2019-06-13
    • 2014-05-24
    • 2021-10-31
    相关资源
    最近更新 更多