Перейти к содержимому


Внимание!

Это форум по извлечению ресурсов из игр: музыки, звуков, текстур, 3D-моделей...
Перед поиском ответов на форуме, рекомендуется ознакомиться с основным сайтом EXTRACTOR.ru!
[ Прочтите внимательно - правила создания тем и ответа в них ]
Все вопросы по запуску игр задавайте в другом месте: Установка и запуск игр.


Фотография

Код к 1-ой статье


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 6

#1 Alpha-koder

Alpha-koder

    Ефрейтор

  • Пользователи
  • 6 сообщений

Отправлено 18 March 2005 - 04:03

Terminus, извини за наглость, но поделись пожалуйста кодом к первой статье (создание карты с помошью бленда) wink.gif

#2 Terminus

Terminus

    Генерал-майор

  • Администраторы
  • 1969 сообщений
  • Пол:Мужчина
  • Город:Санкт-Петербург

Отправлено 18 March 2005 - 11:20

Код игры, к сожалению, пока распространению не подлежит smile.gif

#3 Alpha-koder

Alpha-koder

    Ефрейтор

  • Пользователи
  • 6 сообщений

Отправлено 18 March 2005 - 13:03

Дык, мну не весь код нужен=) а только часть=)?

#4 Terminus

Terminus

    Генерал-майор

  • Администраторы
  • 1969 сообщений
  • Пол:Мужчина
  • Город:Санкт-Петербург

Отправлено 18 March 2005 - 16:15

Я понял smile.gif. Но мне, признаться, влом вырезать из кучи модулей куски, имеющие отношения к отрисовке smile.gif. Статья написана, думаю, достаточно подробно, а отрисовка зависит уже от особенностей Вашего движка.

#5 Alpha-koder

Alpha-koder

    Ефрейтор

  • Пользователи
  • 6 сообщений

Отправлено 18 March 2005 - 17:23

Ну, ладно=)) на нет и суда нет wink.gif))

#6 Vogd

Vogd

    Сержант

  • Пользователи
  • 21 сообщений
  • Город:S-Pb

Отправлено 19 March 2005 - 05:07

по результатам прочтения данной статьи и не без помощи Terminus'a был рожден свой алгоритм, код к сожалению на С, но должен быть понятным. ниже об особенностях и теории.


//TFF - это массив в котором хранятся флажки
//текстур, 0 - первая текстура, 1 - вторая текстура
//этот массив сами заполняйте.

//MapSize - размер нашей карты.
for (i = 1; i < MapSize; i++)
for (j = 1; j < MapSize; j++)
{
//AlphaTFF - массив коэффициентов прозрачности
//заполняем его следующим образом:
//если рядом с точкой (i, j) оказался "вражеский" полигон,
//тогда прозрачность этой точки устанавливается в еденицу,
//если же вокруг все "хорошие", тогда в ноль.
AlphaTFF[i][j] = (TFF[i - 1][j - 1] + TFF[i][j - 1] +
TFF[i - 1][j] + TFF[i][j]);
if (AlphaTFF[i][j] > 0)
AlphaTFF[i][j] = 1;
else
AlphaTFF[i][j] = 0;
}





//отключаем двустороннюю отрисовку полигонов
glEnable(GL_CULL_FACE);
//включаем текстурирование 2d текстурами
glEnable(GL_TEXTURE_2D);
//отключаем тест глубины(важно!)
glDisable(GL_DEPTH_TEST);

//в несколько проходов рисуем все видимые полигоны,
//чем меньше переключений текстур тем быстрее все работает
//в моем случае NumOfTextures = 2
for (k = 0; k < NumOfTextures; k++)
{
glBindTexture(GL_TEXTURE_2D, TextureId[k]);
glBegin(GL_QUADS);
for (i = 0; i < MapSize; i++)
{
for (j = 0; j < MapSize; j++)
{
//х, у - настоящие координаты полигона, а Zoom - размер тайла
x=j*Zoom;
y=i*Zoom;
//TFF - это массив в котором хранятся флажки
//текстур, 0 - первая текстура, 1 - вторая текстура
//этот массив сами заполняйте.
if (TFF[i][j] == k)
{
glTexCoord2d(0, 0);
glVertex3d(x, y, 0);
glTexCoord2d(0, 1);
glVertex3d(x, y + Zoom, 0);
glTexCoord2d(1, 1);
glVertex3d(x + Zoom, y + Zoom, 0);
glTexCoord2d(1, 0);
glVertex3d(x + Zoom, y, 0);
}
}
}
glEnd();
}

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

//включаем разрешение прозрачности и устанавливаем нужный режим блендинга.
glEnable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//переход будем делать за счет второй текстуры.
glBindTexture(GL_TEXTURE_2D, TextureId[1]);
glBegin(GL_QUADS);
for (i = 0; i < MapSize; i++)
{
for (j = 0; j < MapSize; j++)
{
x=j*Zoom;
y=i*Zoom;

// это коэффициенты прозрачности
c1 = AlphaTFF[i][j];
c2 = AlphaTFF[i + 1][j];
c3 = AlphaTFF[i + 1][j + 1];
c4 = AlphaTFF[i][j + 1];

//если все вершины абсолютно прозрачны тогда зачем нам рисовать такой полигон?
if (c1 != 0 || c2 != 0 || c3 != 0 || c4 != 0)
{
glColor4d(1, 1, 1, c1);
glTexCoord2d(0, 0);
glVertex3d(x, y, 0);
glColor4d(1, 1, 1, c2);
glTexCoord2d(0, 1);
glVertex3d(x, y + Zoom, 0);
glColor4d(1, 1, 1, c3);
glTexCoord2d(1, 1);
glVertex3d(x + Zoom, y + Zoom, 0);
glColor4d(1, 1, 1, c4);
glTexCoord2d(1, 0);
glVertex3d(x + Zoom, y, 0);
}
}
}
glEnd();

//включаем что выключили и выключаем что включили.
glDisable(GL_ALPHA_TEST);
glEnable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
glDisable(GL_CULL_FACE);


#7 Vogd

Vogd

    Сержант

  • Пользователи
  • 21 сообщений
  • Город:S-Pb

Отправлено 19 March 2005 - 05:14

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