【问题标题】:rectangular texture in OpenGL with both width and height POTOpenGL中具有宽度和高度POT的矩形纹理
【发布时间】:2021-03-01 21:00:06
【问题描述】:

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

我的显示函数是(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 纹理?我的代码有什么问题?

【问题讨论】:

    标签: opengl 3d texture-mapping


    【解决方案1】:

    您的矩形图像是 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);
    

    【讨论】:

    • 不,它被扭曲了。对问题进行了澄清。 (请注意,您必须将图像缩小一点。否则您只会看到一个大纹素)。
    • 您可以发布/上传失真的图像吗?如果我能看到它是如何扭曲的,也许会更容易。或者口头描述扭曲,是拉伸还是挤压?
    • 您是否试用了我的代码并且对您来说没问题?我看到的是图像最左侧的水平条纹,然后是图像最右侧的另一个水平条纹。
    • 我没有时间深入测试你的代码,但我明天会试一试。好奇:您将纹理从 bmp 加载为 RGBA。您是否也使用 Alpha 通道保存了 64x128.bmp?如果不是,这将导致颜色失真以及对角线(但不是水平:-/)条纹效果。并且:您使用什么 GPU 进行渲染?我曾经遇到过只能正确加载方形 2^n 纹理的旧 ATI-Radeon 的问题。也许在另一台机器上试试你的代码?
    【解决方案2】:

    在为 hw 使用非二次幂值之前,您可能应该检查对 GL_ARB_texture_non_power_of_two 扩展的支持glTexImage2D(),因为指定任意高度和宽度仅适用于此扩展。

    【讨论】:

    • 不。它是 POT 矩形,但它是矩形而不是正方形。
    • “扭曲”是什么意思?它是“在一个方向上未正确缩放”还是“垃圾像素”或“倾斜纹理”?这将有助于理解这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    相关资源
    最近更新 更多