我正在附加用于在正方形上映射图像的代码,但是图像没有正确地映射。
最后的图像正在被平铺。
请让我知道如何纠正这个问题。
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();
}
发布于 2016-11-24 07:32:50
当BMp图像保存在32位深度时,问题得到了解决。在将图像保存在24位深度之后,opengl正确地映射了它。
发布于 2016-11-24 08:10:25
您还有另外一个问题,那就是使用GL_CLAMP
和使用纹理坐标0.0
和1.0
,这些都是脱离纹理的。它将在你的正方形边缘创建一个纹理失真。如果您需要完美的映射,那么有两个可能的解决方案:
sz
(像素),则只需将坐标更改为:
0.0 + (0.5/sz) 1.0 - (0.5/sz)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卡没有此扩展名)。https://stackoverflow.com/questions/40777700
复制相似问题