Форум: "Игры";
Текущий архив: 2008.01.13;
Скачать: [xml.tar.bz2];
ВнизПроективные тени Найти похожие ветки
← →
Зм1й © (2006-12-03 18:03) [0]Здравствуйте. Вот, пытаюсь сделать projective shadow maps. Рисую в текстуру объект чёрным цветом на белом фоне с позиции источника света. Затем накладываю полученную текстуру на другой объект при автоматическом расчёте координат. Вот что получается: http://zmiy-data.narod.ru/Incorrect_shadow.jpg . Параметры текстуры:
const
PlaneS: Array [0..3] of Single = (1, 0, 0, 0);
PlaneT: Array [0..3] of Single = (0, 1, 0, 0);
PlaneR: Array [0..3] of Single = (0, 0, 1, 0);
PlaneQ: Array [0..3] of Single = (0, 0, 0, 1);
GL_CLAMP_TO_EDGE = $812F;
...
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glEnable(GL_TEXTURE_GEN_R);
glEnable(GL_TEXTURE_GEN_Q);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
glTexGenfv(GL_S, GL_EYE_PLANE, @PlaneS);
glTexGenfv(GL_T, GL_EYE_PLANE, @PlaneT);
glTexGenfv(GL_R, GL_EYE_PLANE, @PlaneR);
glTexGenfv(GL_Q, GL_EYE_PLANE, @PlaneQ);
glMatrixMode(GL_TEXTURE);
glLoadIdentity;
glTranslatef(0.5, 0.5, 0);
glScalef(0.5, 0.5, 1);
// Установка проекции и вида камеры
glMatrixMode(GL_MODELVIEW);
glTexImage2D(GL_TEXTURE_2D, 0, 3, 128, 128, 0, GL_RGB, GL_UNSIGNED_BYTE, @ShadowArr);
Скажите, пожалуйста, как нормально наложить текстуру.
← →
Sapersky (2006-12-05 15:43) [1]http://www.paulsprojects.net/tutorials/smt/smt.html
← →
Зм1й © (2006-12-05 19:18) [2]
> Sapersky (05.12.06 15:43) [1]
> http://www.paulsprojects.net/tutorials/smt/smt.html
Но здесь используются теневые буферы, я же их не использую, а рисую лишь силуэт одного объекта в обычную текстуру, что бы потом наложить её на другой объект. То есть я не хочу получить самозатенение объектов, и я не использую никаких расширений OpenGL. Вот тут-то и появляется моя проблема...
← →
Sapersky (2006-12-06 13:53) [3]Ну пардон, я сам, честно говоря, в этот документ не особо вчитывался.
По картинке, кстати, не очень понятно в чём проблема. То ли в том, что тень рисуется не только на кубе, но и на плоскости - но там её, на самом деле, должна перекрыть тень куба, так что сам виноват, что его не учитываешь.
То ли, судя по отсвечивающему в глаз блику, в неправильном направлении тени. По этому поводу должно быть в соотв. документе, т.к. определение направления у всех родственных методов затенения (с исп. текстуры), скорее всего, делается одинаково. Хотя могу и ошибаться - в тенях разбираюсь слабо.
Ещё ссылка:
http://www.devmaster.net/articles/shadows/
- там расписаны все методы.
Charles Bloom тоже что-то писал по поводу теней:
http://www.cbloom.com/3d/index.html
← →
Зм1й © (2006-12-06 19:08) [4]При использовании "теневых буферов" строилась бы тень от куба на плоскость, и она действительно закрывала бы тень от сферы. Но дело в том, что в моём случае тень от куба строиться не должна. Сфера - это один объект, а куб и плоскость - другой. Тень падает только с одного объекта на другой без самозатенения. На сайте gamedev.ru есть статья про использование буферов (http://gamedev.ru/articles/?id=20121), и в постскриптуме написано, что есть ещё способ, который я и пытаюсь использовать, однако про мою проблему там ничего не написано. В обоих документах тоже. Но должа же она как-то решаться, ведь к примеру в hl2 от объектов падают именно такие тени! Я думаю, может дело заключается в установках GL_TEXTURE_WRAP? Я пробовал GL_CLIP, GL_CLIP_TO_EDGE - один результат; GL_CLIP_TO_BORDER вообще не работает. :(
То, что тень падает не из точки, в которой находится "реальный" источник света - это конечно так, я потом сделаю по-нормальному.
← →
Sapersky (2006-12-07 16:53) [5]В статье на DevMaster есть в том числе и Projected Shadows. Все параметры (GL_TEXTURE_WRAP и прочее) расписаны. Хотя сам на работоспособность этот пример не проверял.
← →
Зм1й © (2006-12-07 18:07) [6]Я разумеется смотрел статью, у меня параметры такие же. Но это работает, когда тень падает на плоскость (как на рисунке в статье), а не на сложные объекты.
← →
Sapersky (2006-12-07 20:30) [7]Посмотрел ещё раз картинку... мне кажется, нормальные это побочные эффекты. Метод простой, да, но тупой - таких тонкостей как задняя/передняя грань, что чем закрыто - вполне может не учитывать. На 100% не уверен, уточни на gamedev или ещё где.
hl2 я видел мельком, тени толком не разглядывал. Но судя по
http://en.wikipedia.org/wiki/Source_engine#Future_technologies
система затенения там довольно простая. В частности вот это:
"Dynamic shadows in a map always come from the same predetermined direction". Т.е. источник света, от которого тень, для каждой сцены фиксирован.
Напрашивается некая заранее просчитанная "маска", что ли, которая будет отсекать задние грани и перекрытые другими поверхности.
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2008.01.13;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c