Режим рендеринга полигонов OpenGL и наложение текстур - PullRequest
0 голосов
/ 07 января 2012

задал вопрос о моем проекте ранее, но мне кажется, что я узнаю больше о том, как мало я знаю об openGL, чем о том, что я делаю в данный момент, но любой ответ, который я получаю, подпитывает мои знания, поэтому спасибо заранее!

Хорошо, сейчас моя машина нарисована с помощью GL_LINE_LOOP и выглядит следующим образом. car shape

Изображение, которое я хочу нанести на кузов автомобиля, выглядит следующим образом. car picture

Я знаю, что моя форма не идеальна, но я пытаюсь поместить эту картинку в мои линии, чтобы она, по крайней мере, производила впечатление на машину, которую я моделирую. Я попытался это сделать, используя следующий код:

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);
}

Что приводит к этой ужасности

awful car

Две проблемы. во-первых, мои координаты для текстурирования действительно неверны, а во-вторых, я не знаю, как помешать режиму многоугольника избавиться от колесных арок: / помощь по этим двум направлениям была бы очень признательна :)

1 Ответ

4 голосов
/ 07 января 2012

Координаты текстуры должны находиться в диапазоне [0, 1].

Проблема колесных арок заключается в том, что OpenGL отображает только выпуклые многоугольники.Используйте средства тесселяции для преобразования вогнутых многоугольников в треугольные сетки.

PS: для непосредственного режима 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);
}
...