Код к 1-ой статье
Автор
Alpha-koder
, Mar 18 2005 04:03
Сообщений в теме: 6
#1
Отправлено 18 March 2005 - 04:03
Terminus, извини за наглость, но поделись пожалуйста кодом к первой статье (создание карты с помошью бленда)
#2
Отправлено 18 March 2005 - 11:20
Код игры, к сожалению, пока распространению не подлежит
#3
Отправлено 18 March 2005 - 13:03
Дык, мну не весь код нужен=) а только часть=)?
#4
Отправлено 18 March 2005 - 16:15
Я понял . Но мне, признаться, влом вырезать из кучи модулей куски, имеющие отношения к отрисовке . Статья написана, думаю, достаточно подробно, а отрисовка зависит уже от особенностей Вашего движка.
#5
Отправлено 18 March 2005 - 17:23
Ну, ладно=)) на нет и суда нет ))
#6
Отправлено 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);
//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
Отправлено 19 March 2005 - 05:14
ухх все табы убрались:((
особнность здесь в том, что переход получается "поуже" и еще область второй текстуры расширяется. годится только для ландшафта в котором на фоне первых текстур есть выпуклые пятна из второй текстуры.
Как вы понимаете это все писалось для моего конкретного случая, но я надеюсь что это кому-то чем-то поможет.
без картинок понять почему это работает сложновато, но работает:)
особнность здесь в том, что переход получается "поуже" и еще область второй текстуры расширяется. годится только для ландшафта в котором на фоне первых текстур есть выпуклые пятна из второй текстуры.
Как вы понимаете это все писалось для моего конкретного случая, но я надеюсь что это кому-то чем-то поможет.
без картинок понять почему это работает сложновато, но работает:)