Opengl 图像在正方形上映射不正确

Opengl 图像在正方形上映射不正确,opengl,graphics,Opengl,Graphics,我附上我的代码映射一个正方形上的图像,但图像映射不正确 最后的图像正在平铺 请让我知道如何更正此问题 GLuint LoadTexture( const char * filename ) { GLuint texture; int width, height; unsigned char * data; FILE * file; file = fopen( filename, "rb" ); if ( file == NULL ) { printf

我附上我的代码映射一个正方形上的图像,但图像映射不正确

最后的图像正在平铺

请让我知道如何更正此问题

GLuint LoadTexture( const char * filename )
{

  GLuint texture;
  int width, height;
  unsigned char * data;
  FILE * file;
  file = fopen( filename, "rb" );
  if ( file == NULL )
    {
      printf("\nThe file is not found"); 
       return 0;
     }
   width = 512;
   height = 512;
   data = (unsigned char *)malloc( width * height * 3 );
   //int size = fseek(file,);
   fread( data, width * height * 3, 1, file );
   fclose( file );
   glGenTextures( 1, &texture );
   glBindTexture( GL_TEXTURE_2D, texture );
   glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_DECAL );
   glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST );
   glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR );
   glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,GL_CLAMP );
   glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_CLAMP );
   gluBuild2DMipmaps( GL_TEXTURE_2D, 3, width, height,GL_RGB, GL_UNSIGNED_BYTE,   data );
free( data );
return texture;
}
///////////////////////////////////////////////////////////////////////////////

void display(void)
{

// CLEAR THE WINDOW
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
light();
glPushMatrix();
glLoadIdentity(); 
glTranslatef(0,0,-5);
glViewport(0, 0, window_width, window_height/2);
    glLoadIdentity();
    gluLookAt(0.0, 0.0, 3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
drawObject();
glFlush();
glutSwapBuffers();

}
  void drawSquare()

{
   glBegin(GL_QUADS);              // Each set of 4 vertices form a quad
  //  glColor3f(1.0f, 0.0f, 0.0f); // Red
   glTexCoord2f(0.0f, 1.0f);  
   glVertex2f(-0.2f, 0.2f);
   glTexCoord2f(1.0f, 1.0f);// x, y
   glVertex2f( 0.2f, 0.2f);
   glTexCoord2f(1.0f, 0.0f);
   glVertex2f( 0.2f,  -0.2f);
   glTexCoord2f(0.0f, 0.0f);
   glVertex2f(-0.2f,  -0.2f);
glEnd();



}
    void drawObject(void)

    {   
      // push the current matrix
      glPushMatrix();
      // apply the translation
      glEnable(GL_TEXTURE_2D);
     GLuint  texture;
     texture =  LoadTexture(FName );
     glBindTexture (GL_TEXTURE_2D, texture);

     drawSquare();
/////////////////////////////////////////////////////////////

void display(void)
{

// CLEAR THE WINDOW
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
light();
glPushMatrix();
glLoadIdentity(); 
glTranslatef(0,0,-5);
glViewport(0, 0, window_width, window_height/2);
    glLoadIdentity();
    gluLookAt(0.0, 0.0, 3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
drawObject();
glFlush();
glutSwapBuffers();

}
  void drawSquare()

{
   glBegin(GL_QUADS);              // Each set of 4 vertices form a quad
  //  glColor3f(1.0f, 0.0f, 0.0f); // Red
   glTexCoord2f(0.0f, 1.0f);  
   glVertex2f(-0.2f, 0.2f);
   glTexCoord2f(1.0f, 1.0f);// x, y
   glVertex2f( 0.2f, 0.2f);
   glTexCoord2f(1.0f, 0.0f);
   glVertex2f( 0.2f,  -0.2f);
   glTexCoord2f(0.0f, 0.0f);
   glVertex2f(-0.2f,  -0.2f);
glEnd();



}
    void drawObject(void)

    {   
      // push the current matrix
      glPushMatrix();
      // apply the translation
      glEnable(GL_TEXTURE_2D);
     GLuint  texture;
     texture =  LoadTexture(FName );
     glBindTexture (GL_TEXTURE_2D, texture);

     drawSquare();
////////////////////////////////////////////////////////////////////////

void display(void)
{

// CLEAR THE WINDOW
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
light();
glPushMatrix();
glLoadIdentity(); 
glTranslatef(0,0,-5);
glViewport(0, 0, window_width, window_height/2);
    glLoadIdentity();
    gluLookAt(0.0, 0.0, 3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
drawObject();
glFlush();
glutSwapBuffers();

}
  void drawSquare()

{
   glBegin(GL_QUADS);              // Each set of 4 vertices form a quad
  //  glColor3f(1.0f, 0.0f, 0.0f); // Red
   glTexCoord2f(0.0f, 1.0f);  
   glVertex2f(-0.2f, 0.2f);
   glTexCoord2f(1.0f, 1.0f);// x, y
   glVertex2f( 0.2f, 0.2f);
   glTexCoord2f(1.0f, 0.0f);
   glVertex2f( 0.2f,  -0.2f);
   glTexCoord2f(0.0f, 0.0f);
   glVertex2f(-0.2f,  -0.2f);
glEnd();



}
    void drawObject(void)

    {   
      // push the current matrix
      glPushMatrix();
      // apply the translation
      glEnable(GL_TEXTURE_2D);
     GLuint  texture;
     texture =  LoadTexture(FName );
     glBindTexture (GL_TEXTURE_2D, texture);

     drawSquare();
}


当BMp图像以32位深度保存时,问题得到了解决。 在以24位深度保存图像后,opengl将其正确映射


当BMp图像以32位深度保存时,问题得到了解决。 在以24位深度保存图像后,opengl将其正确映射


您还有一个问题,那就是使用
GL\u夹具
,以及使用纹理坐标
0.0
1.0
,这两种方法都不符合纹理。它将在正方形的边缘上创建1 texel变形。如果需要完美映射,则有两种可能的解决方案:

  • 将纹理坐标移动一半像素

    如果纹理的大小
    sz
    以像素为单位,则只需将坐标更改为:

    0.0+(0.5/sz)
    1.0-(0.5/sz)
    
  • 使用包裹延伸
    GL\u夹紧到\u边缘

    因此,只需将
    GL\u CLAMP
    更改为
    GL\u CLAMP\u到\u EDGE
    ,然后像现在一样使用
    0.0,1.0
    。如果您没有定义“GLU夹紧到边缘”的
    GL\u,请添加:

    \ifndef GL\u夹紧到边缘
    #定义GL_夹具到_边缘0x812F
    #恩迪夫
    
    请注意,您的gfx驱动程序必须支持此扩展(但我不知道任何gfx卡没有此扩展)


  • 另外还有一个问题,那就是使用
    GL_夹具
    ,以及使用纹理坐标
    0.0
    1.0
    ,这两种方法都不符合纹理。它将在正方形的边缘上创建1 texel变形。如果需要完美映射,则有两种可能的解决方案:

  • 将纹理坐标移动一半像素

    如果纹理的大小
    sz
    以像素为单位,则只需将坐标更改为:

    0.0+(0.5/sz)
    1.0-(0.5/sz)
    
  • 使用包裹延伸
    GL\u夹紧到\u边缘

    因此,只需将
    GL\u CLAMP
    更改为
    GL\u CLAMP\u到\u EDGE
    ,然后像现在一样使用
    0.0,1.0
    。如果您没有定义“GLU夹紧到边缘”的
    GL\u,请添加:

    \ifndef GL\u夹紧到边缘
    #定义GL_夹具到_边缘0x812F
    #恩迪夫
    
    请注意,您的gfx驱动程序必须支持此扩展(但我不知道任何gfx卡没有此扩展)


  • 宽度和高度真的是512px吗?这也许可以解释it@MadcoreTom你能解释一下原因吗?我已经检查过BMP图像的大小是512 X 512像素。它看起来像是可以交错多个像素列。如果您只是从标准BMP文件中读取字节,那么我预计您会遇到问题。只要看一下维基页面,我就可以看到每一行都有一些空白,加上一个你似乎没有处理的标题感谢@madcoretom的帮助宽度和高度真的是512px吗?这也许可以解释it@MadcoreTom你能解释一下原因吗?我已经检查过BMP图像的大小是512 X 512像素。它看起来像是可以交错多个像素列。如果您只是从标准BMP文件中读取字节,那么我预计您会遇到问题。只要看一下维基页面,我就可以看到每一行都有一些空白,加上一个你似乎没有处理的标题。谢谢@MadcoreTom的帮助