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的帮助