【问题标题】:OpenGL Polygon rendering mode and texture mappingOpenGL多边形渲染模式和纹理映射
【发布时间】:2012-01-08 08:35:34
【问题描述】:

之前问了一个关于我的项目的问题,但似乎我对 openGL 的了解比我目前所做的更多,但我得到的答案是在补充我的知识,所以提前感谢!

好的,目前我的汽车形状是使用 GL_LINE_LOOP 绘制的,看起来像这样。

我想映射到车身上的图像如下所示。

我知道我的形状图片并不完美,但我试图将那张图片放在我的线条中,以便它至少给人留下汽车模型的一些印象。我已经尝试使用以下代码:

void drawBody(int textureindex)
{
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, textureLib[textureindex]);

glBegin(GL_POLYGON);

glTexCoord2f(0.0F, 0.0F);
glVertex2f(-1.0f, 0.0f);
glTexCoord2f(-0.97, 0.0);
glVertex2f(-1.97f, 0.0f);
//wheel arch begin.
glTexCoord2f(-0.93, 0.3);
glVertex2f(-1.93f, 0.3f);
glTexCoord2f(-0.95, 0.4);
glVertex2f(-1.95f, 0.4f);
glTexCoord2f(-1.2, 0.6);
glVertex2f(-2.2f, 0.6f);
glTexCoord2f(-1.6, 0.6);
glVertex2f(-2.6f, 0.6f);
glTexCoord2f(-1.82, 0.4);
glVertex2f(-2.82f, 0.4f);
glTexCoord2f(-1.8, 0.3);
glVertex2f(-2.8f, 0.3f);
glTexCoord2f(-1.78, 0.0);
glVertex2f(-2.78f, 0.0f);
//end wheel arch.
//Front of car.
glTexCoord2f(-2.8, 0.0);
glVertex2f(-3.8f, 0.0f);
glTexCoord2f(-2.7, 0.2);
glVertex2f(-3.7f, 0.2f);
glTexCoord2f(-2.8, 0.4);
glVertex2f(-3.8f, 0.4f);
glTexCoord2f(-1.8, 0.7);
glVertex2f(-2.8f, 0.7f);
glTexCoord2f(-1.4, 0.7);
glVertex2f(-2.4f, 0.7f);
//Windscreen.
glTexCoord2f(0.0, 1.0);
glVertex2f(-1.0f, 1.0f);
glTexCoord2f(1.5, 1.05);
glVertex2f(0.5f, 1.05f);
glTexCoord2f(3.3, 0.8);
glVertex2f(2.3f, 0.8f);
//rear bumper.
glTexCoord2f(3.15, 0.5);
glVertex2f(2.15f, 0.5f);
glTexCoord2f(3.15, 0.3);
glVertex2f(2.15f, 0.3f);
glTexCoord2f(3.35, 0.3);
glVertex2f(2.35f, 0.3f);
glTexCoord2f(3.0, 0.0);
glVertex2f(2.0f, 0.0f);
glTexCoord2f(2.83, 0.0);
glVertex2f(1.83f, 0.0f);
//wheel arch begin.
glTexCoord2f(2.85, 0.3);
glVertex2f(1.85f, 0.3f);
glTexCoord2f(2.86, 0.4);
glVertex2f(1.86f, 0.4f);
glTexCoord2f(2.6, 0.6);
glVertex2f(1.6f, 0.6f);
glTexCoord2f(2.2, 0.6);
glVertex2f(1.2f, 0.6f);
glTexCoord2f(2.0, 0.4);
glVertex2f(1.0f, 0.4f);
glTexCoord2f(2.0, 0.3);
glVertex2f(1.0f, 0.3f);
glTexCoord2f(2.05, 0.0);
glVertex2f(1.05f, 0.0f);
//end wheel arch.
glEnd();
glDisable(GL_TEXTURE_2D);
}

这导致了这种可怕的情况

两个问题。一是很明显我的纹理坐标确实是错误的,其次我不知道如何阻止多边形模式摆脱轮拱:/在这两个方面的帮助将不胜感激:)

【问题讨论】:

    标签: opengl texture-mapping


    【解决方案1】:

    纹理坐标应在 [0, 1] 范围内。

    轮拱问题是因为 OpenGL 只渲染凸多边形。使用tessellation facilities 将凹多边形转换为三角形网格。

    P.S.:对于 OpenGL 的即时模式,我建议您采用更易于阅读和维护的不同编码风格:

    void drawBody(int textureindex)
    {
        glEnable(GL_TEXTURE_2D);
        glBindTexture(GL_TEXTURE_2D, textureLib[textureindex]);
    
        glBegin(GL_POLYGON);
    
        glTexCoord2f( 0.0 , 0.0 ); glVertex2f(-1.0 , 0.0 );
        glTexCoord2f(-0.97, 0.0 ); glVertex2f(-1.97, 0.0 );
    
        // Wheel arch
        glTexCoord2f(-0.93, 0.3 ); glVertex2f(-1.93, 0.3 );
        glTexCoord2f(-0.95, 0.4 ); glVertex2f(-1.95, 0.4 );
        glTexCoord2f(-1.2 , 0.6 ); glVertex2f(-2.2 , 0.6 );
        glTexCoord2f(-1.6 , 0.6 ); glVertex2f(-2.6 , 0.6 );
        glTexCoord2f(-1.82, 0.4 ); glVertex2f(-2.82, 0.4 );
        glTexCoord2f(-1.8 , 0.3 ); glVertex2f(-2.8 , 0.3 );
        glTexCoord2f(-1.78, 0.0 ); glVertex2f(-2.78, 0.0 );
    
        // Front of car
        glTexCoord2f(-2.8 , 0.0 ); glVertex2f(-3.8 , 0.0 );
        glTexCoord2f(-2.7 , 0.2 ); glVertex2f(-3.7 , 0.2 );
        glTexCoord2f(-2.8 , 0.4 ); glVertex2f(-3.8 , 0.4 );
        glTexCoord2f(-1.8 , 0.7 ); glVertex2f(-2.8 , 0.7 );
        glTexCoord2f(-1.4 , 0.7 ); glVertex2f(-2.4 , 0.7 );
    
        // Windscreen
        glTexCoord2f( 0.0 , 1.0 ); glVertex2f(-1.0 , 1.0 );
        glTexCoord2f( 1.5 , 1.05); glVertex2f( 0.5 , 1.05);
        glTexCoord2f( 3.3 , 0.8 ); glVertex2f( 2.3 , 0.8 );
    
        // Rear bumper
        glTexCoord2f( 3.15, 0.5 ); glVertex2f( 2.15, 0.5 );
        glTexCoord2f( 3.15, 0.3 ); glVertex2f( 2.15, 0.3 );
        glTexCoord2f( 3.35, 0.3 ); glVertex2f( 2.35, 0.3 );
        glTexCoord2f( 3.0 , 0.0 ); glVertex2f( 2.0 , 0.0 );
        glTexCoord2f( 2.83, 0.0 ); glVertex2f( 1.83, 0.0 );
    
        // Wheel arch
        glTexCoord2f( 2.85, 0.3 ); glVertex2f( 1.85, 0.3 );
        glTexCoord2f( 2.86, 0.4 ); glVertex2f( 1.86, 0.4 );
        glTexCoord2f( 2.6 , 0.6 ); glVertex2f( 1.6 , 0.6 );
        glTexCoord2f( 2.2 , 0.6 ); glVertex2f( 1.2 , 0.6 );
        glTexCoord2f( 2.0 , 0.4 ); glVertex2f( 1.0 , 0.4 );
        glTexCoord2f( 2.0 , 0.3 ); glVertex2f( 1.0 , 0.3 );
        glTexCoord2f( 2.05, 0.0 ); glVertex2f( 1.05, 0.0 );
    
        glEnd();
        glDisable(GL_TEXTURE_2D);
    }
    

    【讨论】:

    • 嗯,我现在不明白最后一点,所以我会做一些阅读,但至于第一位,我已经将我所有的坐标都更改为 0 到 1 的范围内,它仍然是有点有趣,我假设我将错误的纹理坐标与形状匹配:(
    • 我打错了;我的意思是,“……转换凹多边形……”。没有看到有趣的形状,我只能猜测:可能是因为纹理车的轮廓与多边形没有完全对齐。
    • 它将图像压缩到形状的后半部分,然后在前面的空白处添加一点图像:/ i378.photobucket.com/albums/oo230/tcc_hellgate/carnew.png
    • @MikeTarrant:你确定你所有的纹理坐标都已经修复了吗?看起来您的原始映射的一部分仍然存在。此外,看起来您可能已将纹理 x 坐标映射到 [-1, 1],而不是 [0, 1]。另一种可能性是 OpenGL 行为不端,因为你给它一个凹多边形来渲染。
    • @MikeTarrant:我建议您在问题中添加代码的修订版本和生成的图像。当你这样做时,请遵循我刚刚附加到我的答案的编码风格的建议。