OpenGL, изометрическая 2D карта и текстуры - PullRequest
0 голосов
/ 29 декабря 2011

В OpenGL я рисую 2D-изометрическую сетку. (картинка: http://i.imgur.com/nUZax.png). Пожалуйста, не возражайте против неаккуратного кода, так как большая часть этого просто пробует что-то, я пытаюсь испачкать руки этим материалом, прежде чем я правильно напишу часть мозаики мой настоящий двигатель.

Каждая плитка имеет ширину 76 пикселей и высоту 38 пикселей. Теперь я хочу текстурировать каждую плитку с помощью небольшой текстуры травы, которую я сделал. Тем не менее, это не будет хорошо!

Моя проблема в том, что текстура продолжает выглядеть испорченной. Это намного меньше, чем должно быть (примерно вдвое меньше), и оно окружено белым. Это код, который я использую, чтобы применить текстуру (размером 76x38, конечно!).

void drawSquare(int x, int y) {
    glEnable( GL_TEXTURE_2D );
    glBindTexture( GL_TEXTURE_2D, texture);
    glBegin(GL_QUADS);
        glTexCoord2i( 38, -19); glVertex2i(x+38, y);
        glTexCoord2i(-38,  19); glVertex2i(x,    y+19);
        glTexCoord2i( 38, -19); glVertex2i(x-38, y);
        glTexCoord2i(-38,  19); glVertex2i(x,    y-19);
    glEnd();
}

Это часть кода, которая вычисляет X и Y.

for (int y = 1; y < gridY+1; y++) {
    for (int x = 1; x < gridX+1; x++) {
        drawSquare((x-y) * 38 + (SCREEN_SIZE_X/2), (x+y) * 19);
    }
}

Вероятно, мне следует добавить, что я выставил настройки моего орто следующим образом.

glOrtho(0, SCREEN_SIZE_X, 0, SCREEN_SIZE_Y, -1, 1);

(SCREEN_SIZE_X и SCREEN_SIZE_Y просто 800x600)

Кто-нибудь, кто мог бы помочь мне здесь? Это будет с благодарностью. Возможно, чтобы сделать это более понятным, вот как это выглядит прямо сейчас!

EDIT: После некоторой помощи это было изменено на это.

glBegin(GL_QUADS);
//glColor3f(r, g, b);
glTexCoord2f(0,1); glVertex2i(x+38, y);
glTexCoord2f(1,1); glVertex2i(x,    y+19);
glTexCoord2f(1,0); glVertex2i(x-38, y);
glTexCoord2f(0,0); glVertex2i(x,    y-19);
glEnd();

Результат: http://i.imgur.com/sOqsH.png

1 Ответ

3 голосов
/ 29 декабря 2011

Координаты текстуры должны изменяться от 0 до 1, а не от -38 до 19 при использовании GL_TEXTURE_2D.

Кроме того, вместо этого следует использовать glTexCoord2f ().

Редактировать: Это, пожалуй, самый простой / лучший способ: просто нарисуйте всю текстуру как один квад, и включите прозрачность (смешивание), просто убедитесь, что у вашей текстуры 100% прозрачность углов!

Примечание: вы можетевсе еще используйте glTexCoord2i (), так как вы всегда используете всю текстуру.Но если вы собираетесь создать атлас текстуры, то необходимо использовать glTexCoord2f ().

void drawSquare(int x, int y) {
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBindTexture(GL_TEXTURE_2D, texture);
    glBegin(GL_QUADS);
        glTexCoord2i(0, 0); glVertex2i(x-38, y-19);
        glTexCoord2i(1, 0); glVertex2i(x+38, y-19);
        glTexCoord2i(1, 1); glVertex2i(x+38, y+19);
        glTexCoord2i(0, 1); glVertex2i(x-38, y+19);
    glEnd();
}

Помните: нулевая точка координат текстуры (0,0) равна внизу слева

Кроме того, не забудьте установить blendmode как:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Кроме того, убедитесь, что вы загружаете текстуру с альфа-каналом, если он все еще не работает, убедитесь, что альфа-канал существует в вашем openglтекстура.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...