2010-08-09 83 views
2

我试图在OpenGL中使用矩形纹理。当高度等于纹理的宽度时,一切看起来都很好,但是,当高度与宽度不同时,纹理看起来会变形。OpenGL中的矩形纹理,宽度和高度POT

我的显示功能(hw是全局存储的高度和图像的宽度):

请注意,绘制图像的大小并不重要。无论实际的多边形大小如何,它都会失真。

void display(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glEnable(GL_TEXTURE_2D); 
    glEnable(GL_BLEND); 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); 
    glBindTexture(GL_TEXTURE_2D, texName); 
    glTranslatef(-2.0f,-2.0f,0.0f); 
    glScalef(1.0f/128.0f,1.0f/128.0f,1.0f); 
    glBegin(GL_QUADS); 
    glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.0, 0.0); 
    glTexCoord2f(0.0, 1.0); glVertex3f(0.0, w, 0.0); 
    glTexCoord2f(1.0, 1.0); glVertex3f(h, w, 0.0); 
    glTexCoord2f(1.0, 0.0); glVertex3f(h, 0.0, 0.0); 

    // Will be distorted also with the following: 
    /*glScalef(1.0f/128.0f,1.0f/128.0f,1.0f); 
    glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.0, 0.0); 
    glTexCoord2f(0.0, 1.0); glVertex3f(0.0, h, 0.0); 
    glTexCoord2f(1.0, 1.0); glVertex3f(w, h, 0.0); 
    glTexCoord2f(1.0, 0.0); glVertex3f(w, 0.0, 0.0);*/ 

    glEnd(); 
    glFlush(); 
    glDisable(GL_TEXTURE_2D); 
} 

我加载的质地:

void *data = LoadBMP("c:\\dev\\64x128_face.bmp"); 
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 

glGenTextures(1, &texName); 
glBindTexture(GL_TEXTURE_2D, texName); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 
       GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 
       GL_NEAREST); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, 
      h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 
      data); 

当我加载64x64方形纹理图像,它看起来不错。但是,当我加载矩形纹理图像时,图像看起来失真。

OpenGL如何支持矩形POT纹理?我的代码有什么问题?

回答

0

你的矩形图像是64x128但这些命令使它:

glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.0, 0.0); 
    glTexCoord2f(0.0, 1.0); glVertex3f(0.0, w, 0.0); 
    glTexCoord2f(1.0, 1.0); glVertex3f(h, w, 0.0); 
    glTexCoord2f(1.0, 0.0); glVertex3f(h, 0.0, 0.0); 

其中,h是高度(= 128)和W(= 64)是宽度。 但是你把高度放在x(这是宽度)和y(这是高度)上的宽度。 也许试试这个来代替:

glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.0, 0.0); 
    glTexCoord2f(0.0, 1.0); glVertex3f(0.0, h, 0.0); 
    glTexCoord2f(1.0, 1.0); glVertex3f(w, h, 0.0); 
    glTexCoord2f(1.0, 0.0); glVertex3f(w, 0.0, 0.0); 
+0

不,它被扭曲永远不会少。增加了对问题的澄清。 (注意你必须稍微缩放图像,否则你只会看到一个大的纹理元素)。 – 2010-08-09 13:26:11

+0

您可以发布/上传失真图片吗?如果我能看出它是如何扭曲的话,也许会更容易些。或者口头形容这种变形,是伸展还是挤压? – Rock 2010-08-09 19:11:30

+0

你有没有试过我的代码,它对你来说OK?我所看到的是图像最左侧部分的横条纹,然后是图像最右侧部分的另一条横条纹。 – 2010-08-10 18:17:38

0

你或许应该检查GL_ARB_texture_non_power_of_two扩展的支持,你在glTexImage2D(使用非电的二值^hW¯¯之前) ,因为指定任意高度和宽度仅对此扩展有效。

+0

nope。它是一个POT矩形,但它是一个矩形而不是方形。 – 2010-08-14 19:14:31

+0

“扭曲”是什么意思?它是否在'方向之一'或'垃圾像素'或'倾斜纹理'中未正确缩放?这将有助于理解这个问题。 – mbaitoff 2010-08-18 05:58:18