首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不正确地在正方形上映射的图像

不正确地在正方形上映射的图像
EN

Stack Overflow用户
提问于 2016-11-24 03:43:08
回答 2查看 85关注 0票数 0

我正在附加用于在正方形上映射图像的代码,但是图像没有正确地映射。

最后的图像正在被平铺。

请让我知道如何纠正这个问题。

代码语言:javascript
运行
复制
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;
}

///////////////////////////////////////////////////////////////////////////////

代码语言:javascript
运行
复制
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();

}

/////////////////////////////////////////////////////////////

代码语言:javascript
运行
复制
  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();



}

////////////////////////////////////////////////////////////////////////

代码语言:javascript
运行
复制
    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();

}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-24 07:32:50

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

票数 1
EN

Stack Overflow用户

发布于 2016-11-24 08:10:25

您还有另外一个问题,那就是使用GL_CLAMP和使用纹理坐标0.01.0,这些都是脱离纹理的。它将在你的正方形边缘创建一个纹理失真。如果您需要完美的映射,那么有两个可能的解决方案:

  1. 将纹理坐标移动到像素的一半 如果纹理的大小为sz (像素),则只需将坐标更改为: 0.0 + (0.5/sz) 1.0 - (0.5/sz)
  2. GL_CLAMP_TO_EDGE 使用包装扩展 因此,只需将GL_CLAMP更改为GL_CLAMP_TO_EDGE,并像现在一样使用0.0,1.0。如果您没有定义GL_CLAMP_TO_EDGE,请添加: #ifndef GL_CLAMP_TO_EDGE #定义GL_CLAMP_TO_EDGE 0x812F #endif 请注意,您的gfx驱动程序必须支持此扩展名(不过,我不知道任何gfx卡没有此扩展名)。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40777700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档