2013-11-24 4 views
1

Я пытался сделать Worms стиль разрушаемого местности, и до сих пор это продолжается уже довольно хорошо ...Aliasing проблема с SDL + OpenGL маскирования

Snapshot1

Я сфальсифицированы его так, чтобы следующие изображение замаскировано на «шоколадную» текстуру.

CircleMask.png

Однако, как можно увидеть на Снимок 1, «ребра» по CircleMask все еще видны (перекрывают друг друга). Я вполне уверен, что это связано с псевдонимом, поскольку изображение маски растягивается перед тем, как оно применяется (и SquareMask.png не имеет этой проблемы). Это моя проблема.

Мой маскирующий код выглядит следующим образом:

void MaskedSprite::draw(Point pos) 
{ 
    glEnable(GL_BLEND); 

    // Our masks should NOT affect the buffers color, only alpha. 
    glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE); 

    glBlendFunc(GL_ONE_MINUS_DST_ALPHA,GL_DST_ALPHA); 

    // Draw all holes in the texture first. 
    for (unsigned i = 0; i < masks.size(); i++) 
     if (masks.at(i).mask) masks.at(i).mask->draw(masks.at(i).pos, masks.at(i).size); 

    // But our image SHOULD affect the buffers color. 
    glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 

    // Now draw the actual sprite. 
    Sprite::draw(pos); 

    glDisable(GL_BLEND); 
} 

Функция Жеребьевка() рисует четырехугольник с текстурой на нем на экране. Он не имеет функций смешивания.

ответ

1

Если инвертировать альфа-канал на вашей маске изображения так, что внутри круга имеет альфа-0.0, Вы можете использовать следующий режим смешивания:

glClearColor(0,0,0,1); 
// ... 
glBlendFunc(GL_DST_ALPHA, GL_ZERO); 

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

Обратите внимание, что с использованием этой технологии любой альфа-канал в текстуре спрайта будет проигнорирован. Кроме того, если вы создаете фон перед рельефом, вам нужно будет изменить функцию смешивания перед рендерингом конечного изображения спрайта. Что-то вроде glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA) будет работать.

Другим решением было бы использовать режим смешивания, но установить режим интерполяции маску текселя к ближайшим соседям, чтобы гарантировать, что каждое значение выборки из маски либо 0,0 или 1,0:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

Мой последний бит совет таков: сложная часть о разрушаемой 2D-рельефе не дает правильной визуализации, она делает обнаружение столкновения с ней. Если вы не подумали о том, как вы планируете заниматься этим, вы, возможно, захотите.

+0

Эй! Ты сделал это! Я сделал вторую альтернативу (изменив интерполяцию текстур с GL_LINEAR на GL_NEAREST), и она устранила проблему. И не беспокойтесь, у меня уже есть столкновение. Спасибо! – Milun

+1

@ user3011203 Вместо того, чтобы обновлять свой вопрос с ответом, примите ответ, данный bcrist. – Joetjah

+0

@Joetjah Упс. Виноват. Извините, я новичок в этом (как вы можете сказать). – Milun