2011-12-29 4 views
0

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

Каждая плитка имеет ширину 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 просто быть 800х600)

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

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

ответ

3

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

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

Edit: Это, вероятно, самый простой/лучший способ: просто нарисовать всю текстуру в качестве одного четырехугольника, и включить прозрачность (смешивания), просто убедитесь, что ваша текстура имеет углы 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.

+0

Я пробовал это, но затем текстура все еще выходит из строя. Я мог бы показать вам, как это выглядит в этом случае. –

+0

Вы зажимали ваши координаты текстуры между 0 и 1? попробуйте использовать только 0 и 1 и посмотреть, отображается ли текстура _completely_ в каждой плитке, если нет, то что-то еще не так ... – Rookie

+0

Обновлено исходное сообщение с снимком экрана и кодом. –

Смежные вопросы