ВНИМАНИЕ! Наша конференция посвящена космической тематике и компьютерным играм. Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!
|
» Алгоритмические вопросы. | страница 1 |
|
|
|
Канал Игры Мечты: «Алгоритмические вопросы.» |
|
|
Shirson 1605 EGP
Рейтинг канала: 7(626) Репутация: 219 Сообщения: 16511 Откуда: 79°W 44°N Зарегистрирован: 29.01.2002 |
|
Коллеги, есть пара вопросов по расчёту цветов при освещении.
Имеется точка, определённого цвета RGB.
Имеется источник света, определённого цвета RGB.
1. Источник освещает точку. Как вычислить её конечный цвет RGB?
2. Несколько источников светят на точку. Как вычислить суммарный RGB цвет истоников (и, далее, п1)?
Не нужно заморачиваться дистанциями, углами, нормалями, материалами, и прочим. Всё предельно просто - есть цвет источника света, есть цвет точки, как посчитать результат.
Первое, что приходит в голову, источники света складывать по OR, а точку освещать по AND.
_________________ У меня бисера не доxеpа. |
|
|
Minx 985 EGP
Рейтинг канала: 6(329) Репутация: 135 Сообщения: 10533 Откуда: Gomel, Belarus Зарегистрирован: 19.11.2005 |
|
Shirson : |
Первое, что приходит в голову, источники света складывать по OR, а точку освещать по AND.
|
Если RGB, то вряд ли чистый OR по всему слову.
Потому что 1 OR 2 = 3, а 2 OR 2 = 2, хотя по идее второе должно быть больше.
Понятно, что каждый цвет должен обрабатываться отдельно, т.е. X+Y сделать нельзя, т.к. например G вылезет за пределы, исчезнет, и чуть даст в другой цвет (кто там постарше, B что ли).
Полагаю, что цвет (речь идет про отдельный цвет из R, G и B) ограничен каким-то множеством (0..255 например), и если два источника светят на одно место (X и Y), то наверное результат должен быть больше как X'a, так и Y'a. Или равен наибольшему. Поэтому думаю достаточно выбрать какую-нибудь функцию с ассимптотой 255, желательно симметричной относительно аргументов (т.е. f(x,y) = f(y,x)).
Первый самый простой пример такой функции
f1(x,y) = max(x,y)
Второй пример (мне нравится (; ) - релитивисткое сложение цветов:
f2(x,y) = (x+y)/(1 + x*y/c^2), где c=255
т.е. суммируя два (и более) любых цвета мы получим освещенное не больше некоторого предела (255), и к нему оно будет стремиться плавно
т.е. например f(100,200) = ~229.
Цвет точки полагаю это какого она цвета, когда она освещена ярко по максимуму по всему RGB. Т.е. цвет точки определяет максимальное значение цвета. Во втором примере функции это число 'c' для каждого соответствующего R, G, B (c(R), c(G), c(B)). Или обрезать по верхнему пределу в случае первого примера ( f(x,y) = min( max(x,y), c) ).
_________________ μηδείς αγεωμέτρητος εισίτω
Последний раз редактировалось: Minx (19:23 03-09-2014), всего редактировалось 9 раз(а) |
|
|
Shirson 1605 EGP
Рейтинг канала: 7(626) Репутация: 219 Сообщения: 16511 Откуда: 79°W 44°N Зарегистрирован: 29.01.2002 |
|
Minx : |
Если RGB, то вряд ли чистый OR по всему слову.
Потому что 1 OR 2 = 3, а 2 OR 2 = 2, хотя по идее второе должно быть больше.
|
Надо на натуре посмотреть. Если погрешности незаметны для глаза - вполне схавательно.
Цитата: |
Второй пример (мне нравится (; ) - релитивисткое сложение цветов:
f(x,y) = (x+y)/(1 + x*y/c^2), где c=255
т.е. суммируя два (и более) любых цвета мы получим освещенное не больше некоторого предела (255), и к нему оно будет стремиться плавно
т.е. например f(100,200) = ~229.
|
Это я уже даже где-то видил
Цитата: |
Цвет точки полагаю это какого она цвета, когда она освещена ярко по максимуму по всему RGB. Т.е. цвет точки определяет максимальное значение цвета.
|
Были такие рассуждения, что цвет точки принимается за 1, соответсвтенно уровень освещённости меняет цвет от 0 (нет света) до 1 (максимальный свет). Что-то мне в этом не понравилось... непомню уже что
Цитата: |
Во втором примере функции это число 'c' для каждого соответствующего R, G, B (c(R), c(G), c(B)). Или обрезать по верхнему пределу в случае первого примера ( f(x,y) = min( max(x,y), c) ).
|
Это хороший вариант, надо опробовать.
Кстати, как в этом варианте быстро и просто организовать засветки? Т.е. когда интенсивность света настолько вылика, что высвечивает точку (в пределе) до белого?
_________________ У меня бисера не доxеpа. |
|
|
Minx 985 EGP
Рейтинг канала: 6(329) Репутация: 135 Сообщения: 10533 Откуда: Gomel, Belarus Зарегистрирован: 19.11.2005 |
|
Shirson : |
Надо на натуре посмотреть. Если погрешности незаметны для глаза - вполне схавательно.
|
Тут могут быть внезапные погрешности по разрядам числа (в 2 c/c). Т.е. 128 OR 127 = 255, 128 OR 128 = 128. Это будет проявляться случайно, резко, и думаю будет раздражать.
Shirson : |
Были такие рассуждения, что цвет точки принимается за 1, соответсвтенно уровень освещённости меняет цвет от 0 (нет света) до 1 (максимальный свет). Что-то мне в этом не понравилось... непомню уже что
|
Выше и сейчас не очень понял что такое цвет точки. Поэтому решил, что это цвет, когда точка освещена по-максимуму. Т.е. если это АЧТ, то оно и в темноте и на свете АЧТ. Если это зеленое, то оно на свету зеленое и черное в темноте.
Можно принять цвет точки как цвет при каком-то определенном освещении. Т.е. если RGB = #808080, то цвет такой, какого цвета тело. Но мне кажется это лишняя сложность.
Shirson : |
Кстати, как в этом варианте быстро и просто организовать засветки? Т.е. когда интенсивность света настолько вылика, что высвечивает точку (в пределе) до белого?
|
Может превышение некоторого предела или процента от цвета точки есть засветка. По-моему, это уже от конкретной задачи зависит.
Обычно точка комнаты или освещена, или нет, и тени разной интенсивности. Так чаще всего минимальное освещение воспринимается. А что-то большее - отражательные поверхности, вспышка слева, ... - по-моему, это лучше делать всего другим слоем, другой абстракцией. И опять же, от задачи зависит.
_________________ μηδείς αγεωμέτρητος εισίτω |
|
|
Shirson 1605 EGP
Рейтинг канала: 7(626) Репутация: 219 Сообщения: 16511 Откуда: 79°W 44°N Зарегистрирован: 29.01.2002 |
|
Что-то не склеилось с формулой.
x=120; y=0; c=89; f=120;
Хм... Цвет точки просто так суда совать явно нельзя
_________________ У меня бисера не доxеpа. |
|
|
Minx 985 EGP
Рейтинг канала: 6(329) Репутация: 135 Сообщения: 10533 Откуда: Gomel, Belarus Зарегистрирован: 19.11.2005 |
|
Да, формула предполагает, что изначально двигаться быстрее 'c' нельзя.
У меня ещё был вариант (третий для списка выше):
f3(x,y) = x + (c - x)*y/c
он вроде обладает теми же свойствами, что и релитивисткий (ассимптота к 'c'), и очень похож по результатам. Но релятивисткий прикольнее и убедительнее (в плане ассимптоты).
Вообще эти случаи как-то несовсем предсказуемо ведут себя при выше 'c'. Например 300+0 быстрее, чем 300+300. Поэтому если нет предела цвета, то на них наверно нужно забить.
Код: |
x y c f3 f2
100 200 255 221.5686275 229.4325198
1 1 255 1.996078431 1.999969243
120 120 255 183.5294118 196.4872521
50 70 255 106.2745098 113.8708501
500 200 255 307.8431373 275.8218452
250 250 255 254.9019608 254.9500098
255 255 255 255 255
20 30 255 47.64705882 49.54285714
240 50 255 242.9411765 244.8198637
210 60 255 220.5882353 226.173913
256 254 255 255.0039216 255.0019608
300 300 255 247.0588235 251.6690856
300 10 255 298.2352941 296.3285557 |
_________________ μηδείς αγεωμέτρητος εισίτω
Последний раз редактировалось: Minx (19:23 03-09-2014), всего редактировалось 8 раз(а) |
|
|
Minx 985 EGP
Рейтинг канала: 6(329) Репутация: 135 Сообщения: 10533 Откуда: Gomel, Belarus Зарегистрирован: 19.11.2005 |
|
Может банальное сложение с ограничением? Или оно не катит?
Т.е.
f4(x,y) = min( x+y, c )
И сделать засветку при 'c'.
Ведь OR по существу работает почти как сложение (если биты разные). Но не всегда в полное сложение (если биты одинаковые).
Или сделать какой-нибудь гибрид (между f1 и f4, в плюс половина сложения):
f5(x,y) = min( max(x,y) + min(x,y)/2, c)
получится почти как OR, только без внезапных прыганий.
_________________ μηδείς αγεωμέτρητος εισίτω
Последний раз редактировалось: Minx (19:50 03-09-2014), всего редактировалось 3 раз(а) |
|
|
Shirson 1605 EGP
Рейтинг канала: 7(626) Репутация: 219 Сообщения: 16511 Откуда: 79°W 44°N Зарегистрирован: 29.01.2002 |
|
f4 не прокатит, min(x+y, c)это вообще ад
Скорее что-нибудь вроде min(max(x,y), c)
Надо потестить на реальных цветах.
_________________ У меня бисера не доxеpа. |
|
|
Guest 2075 EGP
Рейтинг канала: 5(167) Репутация: 376 Сообщения: 27975 Откуда: Моск. Зарегистрирован: 12.10.2004 |
|
Shirson : |
Не нужно заморачиваться дистанциями, углами, нормалями, материалами, и прочим. Всё предельно просто - есть цвет источника света, есть цвет точки, как посчитать результат.
|
Эм. Какбэ очень сильно зависит.
Если тебе для реала - то аддитивно и нужно определять границы для RGB LDR, ибо обычно 32bpp.
Если для виртуала - источник может иметь любой алгоритм смешивания, необязательно аддитивный, и необязательно иметь положительную интенсивность. Точка опять же может очень по-разному реагировать на освещённость.
Если совсем тупо, то clamp((point_color + light_color),255), но это к случаю самосветимости точки плюс будет выглядеть глупо, т.к. для засветики необходимо превышение всех трёх компонентам уровня среза LDR. Если точка не самосветима - то скорее clamp((point_color * light_color * light_intensity),255). Всё же засветка обычно делается только на блике.
_________________ Трещит земля как пустой орех
Как щепка трещит броня |
|
|
Jurec 348 EGP
Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006 |
|
Ну ребят вы даете.
В CG делают так: http://en.wikipedia.org/wiki/Rendering_equation
В частном случае
Shirson : |
Коллеги, есть пара вопросов по расчёту цветов при освещении.
Имеется точка, определённого цвета RGB.
Имеется источник света, определённого цвета RGB.
1. Источник освещает точку. Как вычислить её конечный цвет RGB?
2. Несколько источников светят на точку. Как вычислить суммарный RGB цвет истоников (и, далее, п1)?
Не нужно заморачиваться дистанциями, углами, нормалями, материалами, и прочим. Всё предельно просто - есть цвет источника света, есть цвет точки, как посчитать результат.
|
1) Color = Light_color * Point_color;
2) Color = SUM( Light_color_i * Point_color );
В случае LDR color в промежутке [0..255]. В случае HDR - промежуток больше, но там надо будет переводить назад в [0..255] с помощью tone mapping'а.
Да, сумма.
Да, оно может выйти за 255, и это пределы монитора. Хотите - делайте HDR, где нет ограничения в 255, но есть другие приколы
добавлено спустя 7 минут:
Shirson : |
Кстати, как в этом варианте быстро и просто организовать засветки? Т.е. когда интенсивность света настолько вылика, что высвечивает точку (в пределе) до белого?
|
Это HDR. Вообще то что вы пытаетесь тут сделать очень напоминает мне Tone Mapping - http://en.wikipedia.org/wiki/Tone_mapping
Как раз перевод из одного пространства цвета в другой.
Ну и в HDR засвеченные (у которых цвет больше 255) участки размывают, создавая "свечение", все равно вы это не нарисуете на мониторе
_________________ MOV topka, C++
Последний раз редактировалось: Jurec (10:35 04-09-2014), всего редактировалось 2 раз(а) |
|
|
Minx 985 EGP
Рейтинг канала: 6(329) Репутация: 135 Сообщения: 10533 Откуда: Gomel, Belarus Зарегистрирован: 19.11.2005 |
|
Изначально я так понял, что нужна не реальность, а собственный велосипед, чтобы можно было сделать свои краски. И соответственно интересуют способы сборки таких штук.
На днях вот только узнал про почему звезды и источники света у людей изображаются с лучами. Такие штуки тоже надо как-то алгоритмизить.
_________________ μηδείς αγεωμέτρητος εισίτω |
|
|
Guest 2075 EGP
Рейтинг канала: 5(167) Репутация: 376 Сообщения: 27975 Откуда: Моск. Зарегистрирован: 12.10.2004 |
|
Если изначально считать в LDR, в белый тоже так же вылезти несложно, благо множители. Достаточно упереться в ограничение цветового диапазона по всем трём компонентам. Более того, эффект bloom (гало вокруг пересвеченных частей изображения), как и некоторые другие интересные вещи также можно легко и спокойно делать в этом пространстве, не нагружаясь расширенным диапазоном.
Minx : |
На днях вот только узнал про почему звезды и источники света у людей изображаются с лучами. Такие штуки тоже надо как-то алгоритмизить.
|
А там-то что алгоритмизить? В простейшем случае это текстура в проецируемом положении источника, в более сложном текстуру можно собрать параметрически, но зачем?
Фокус там в том, что у протяжённого яркого источника света таких явных лучей не будет, просто размытый ореол.
Разве что возникает вопрос, как обрабатывать такие штуки, как яркие блики на воде, т.е. в областях переменного размера, формы и положения.
_________________ Трещит земля как пустой орех
Как щепка трещит броня |
|
|
Jurec 348 EGP
Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006 |
|
Minx : |
Изначально я так понял, что нужна не реальность, а собственный велосипед, чтобы можно было сделать свои краски. И соответственно интересуют способы сборки таких штук.
|
Я пропустил что-то? Откуда это?
Minx : |
Такие штуки тоже надо как-то алгоритмизить.
|
В ray tracing'е может быть. В real-time это делают через фейки. Не все ведь алгоритмизировать, сильно жирно выходит.
Guest : |
Если изначально считать в LDR, в белый тоже так же вылезти несложно, благо множители
|
Что значит вылезти несложно? Не делай ярких источников. Это ведь от сцены зависит. Все так делают и вроде ок. Или делай HDR с тон маппингом
Guest : |
Более того, эффект bloom (гало вокруг пересвеченных частей изображения), как и некоторые другие интересные вещи также можно легко и спокойно делать в этом пространстве, не нагружаясь расширенным диапазоном.
|
Ну например: в одном случае засвет будет в 4 раза больше LDR (4.0), в другом случае будет просто белый цвет (1.0). В LDR эта инфа потеряется, потому что все упрется в 1.0. И блум в таком случае будет абсолютно одинаковый. Что не корректно.
_________________ MOV topka, C++
Последний раз редактировалось: Jurec (10:35 04-09-2014), всего редактировалось 1 раз |
|
|
Shirson 1605 EGP
Рейтинг канала: 7(626) Репутация: 219 Сообщения: 16511 Откуда: 79°W 44°N Зарегистрирован: 29.01.2002 |
|
И что?
Ну делают, ну молодцы. Мне, с моей задачей, от этого ни холодно, ни жарко
Цитата: |
1) Color = Light_color * Point_color;
2) Color = SUM( Light_color_i * Point_color );
В случае LDR color в промежутке [0..255]. В случае HDR - промежуток больше, но там надо будет переводить назад в [0..255] с помощью tone mapping'а.
Да, сумма.
Да, оно может выйти за 255, и это пределы монитора. Хотите - делайте HDR, где нет ограничения в 255, но есть другие приколы
|
Вопрос был не про HDR или LDR, а конкретно про способы вычисления освещённости точки. Как сделать HDR я и сам знаю, причём в ракурсе своей задачи. Это-то как раз не проблема. Мне просто нужна была базовая арифметика освещения - предельно просто и предельно быстро
Цитата: |
Shirson : |
Кстати, как в этом варианте быстро и просто организовать засветки? Т.е. когда интенсивность света настолько вылика, что высвечивает точку (в пределе) до белого?
|
Это HDR.
|
Нет, Jurec, это взаимоисключающие параграфы
Я спрашиваю как быстро и безболезненно сделать (в ракурсе ответов на предыдущие вопросы) засветку вплоть до выбеливания, а ты говоришь, что это HDR. Который по определению не подразумевает выхода за этот самый range, потому что для него всё что угодно упихивается в этот самый range
Вот это HDR:
А мне нужно вот это:
Ы?
Нихт, как это делать я знаю. Вопрос был про базовую арифметику освешения.
Цитата: |
Ну и в HDR засвеченные (у которых цвет больше 255) участки размывают, создавая "свечение", все равно вы это не нарисуете на мониторе
|
Вторую часть непонял, но это тоже не суть.
Абисняю свой вапроз.
Я делаю третью версию своего roguelike шутера. Первый был сделан на конкурс и работал только с 16 цветами EGA (это было конкурсное условие). Второй наследовал это ограничение и в одной из POC-версий имел готовую систему статического и динамического освещения, реализованную в 16 цветах Выглядело это шикарно, а осветительная арифметика была крайне проста (из-за огранчиений по цветности).
Источники света были бесцветными
Интенсивностей света было пять
llDarkness - отсутствие освещения, чёрный результирующий.
llVeryLow - Цвета меньше 8 - в чёрный, больше - в свой тёмный вариант (условно цвет-7)
llLow - Цвета меньше 8 - в тёмно-серый, больше - в в свой тёмный вариант
llNormal - как есть
llOver - - Цвета меньше 8 - в свой светлый вариант (цвет+7), больше - в белый
Вот вся африфетика уже и описана. Всё это прекрасно работало, но хотелось большего.
Сейчас я делаю идейного наследника, но уже в полных цветах.
Соответственно, для расчёта освещения мне нужно понять, как расчитывается освещение для точки от одного или нескольких источников света. Ввиду специфики самой игры, нет заморочек с нормалями, углами, и пр. особенностями трехмерных освещений поверхностей. И всё расчитывается CPU, причём размер крайне небольшой - 49х49 условноточек в идеале, либо до 512х512 при полной обработке.
Нет никаких других вопросов, кроме как заданные в топикстарте - есть RGB-точка, на неё светит RGB-источник(и) света, как вычислить RGB-результат. Интересует только это.
_________________ У меня бисера не доxеpа. |
|
|
Jurec 348 EGP
Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006 |
|
Shirson : |
Нет никаких других вопросов, кроме как заданные в топикстарте - есть RGB-точка, на неё светит RGB-источник(и) света, как вычислить RGB-результат. Интересует только это.
|
Начну с цитирования себя же
Jurec : |
1) Color = Light_color * Point_color;
2) Color = SUM( Light_color_i * Point_color );
|
Всё.
Теперь флуд по пунктам
Shirson : |
И что?
Ну делают, ну молодцы. Мне, с моей задачей, от этого ни холодно, ни жарко
|
Из этой формулы видно что если источников несколько - цвет нужно суммировать.
Когда я говорю HDR, я больше имею ввиду технологию из cg. А не HDR фотки.
HDR в cg - http://en.wikipedia.org/wiki/High-dynamic-range_rendering
Shirson : |
Ввиду специфики самой игры, нет заморочек с нормалями, углами, и пр. особенностями трехмерных освещений поверхностей
|
Ну скорее всего еще есть заморочка связанная с радиусом освещения источника света. То есть light attenuation.
добавлено спустя 3 минуты:
Shirson : |
А мне нужно вот это:
|
Объясняю на пальцах как это делать:
1) рендерицо все в HDR текстуру. Да, там где цвет может быть больше 255.
2) засвет - это там где цвет как раз таки больше 255.
3) нарисовать на мониторе мы можем только цвета в рамках 0-255, поэтому с засветом надо че-то сделать
4) выделяем участки ТОЛЬКО с засветом
5) блурим их гауссом
6) аддитивно накладываем на остальную картинку
в итоге получаем
_________________ MOV topka, C++
Последний раз редактировалось: Jurec (16:40 04-09-2014), всего редактировалось 3 раз(а) |
|
|
Shirson 1605 EGP
Рейтинг канала: 7(626) Репутация: 219 Сообщения: 16511 Откуда: 79°W 44°N Зарегистрирован: 29.01.2002 |
|
Jurec : |
Начну с цитирования себя же
Jurec : |
1) Color = Light_color * Point_color;
2) Color = SUM( Light_color_i * Point_color );
|
Всё.
|
Я твоя математика не понимать.
Если у меня точка красная 255 и лампочка 255, результат будет 65к?
Цитата: |
Из этой формулы видно что если источников несколько - цвет нужно суммировать.
|
Я простой человек, понимающий простые символы. "Суммировать цвет" для меня значит Rr=R1+R2, что изначально не имеет ровно никакого смысла.
Цитата: |
Ну скорее всего еще есть заморочка связанная с радиусом освещения источника света. То есть light attenuation.
|
Если бы мне нужно была помощь с этой заморочкой, я бы про ней спросил А мне с ней помощь не нужна совсем
Цитата: |
Объясняю на пальцах как это делать:
1) рендерицо все в HDR текстуру
|
Это неправильные пальцы. Мне неважно что и в какую текстуру рендерится. Потому что у меня не рендерится вообще ничего. Мне нужна арифметика освещения в понятных простому человеку терминах.
_________________ У меня бисера не доxеpа. |
|
|
Olorin 70 EGP
Рейтинг канала: 1(6) Репутация: 12 Сообщения: 97 Откуда: Хьёрвард Зарегистрирован: 27.02.2006 |
|
Shirson : |
Jurec : |
Начну с цитирования себя же
Jurec : |
1) Color = Light_color * Point_color;
2) Color = SUM( Light_color_i * Point_color );
|
Всё.
|
Я твоя математика не понимать.
Если у меня точка красная 255 и лампочка 255, результат будет 65к?
|
Если цвет источников 0-255 и цвет точки 0-255, то видимый будет...
Псевдо-C#-c-LINQ:
resultColor = pointColor * Max(lightsColor.Select(c => c / 255.0).Sum(), 1.0) // для каждой компоненты
Засветка проходом сверху по растру: интенсивность компоненты каждой точки увеличиваем пропорционально количеству точек с интенсивностью 255 поблизости.
_________________ Мы на многое не отваживаемся не потому что оно трудно; оно трудно именно потому, что мы на него не отваживаемся.
Сенека Старший
Последний раз редактировалось: Olorin (17:47 04-09-2014), всего редактировалось 3 раз(а) |
|
|
Shirson 1605 EGP
Рейтинг канала: 7(626) Репутация: 219 Сообщения: 16511 Откуда: 79°W 44°N Зарегистрирован: 29.01.2002 |
|
Doj озвучил это так
Result := RGB(Color.R * Light.R / 255, Color.G * Light.G / 255, Color.B * Light.B / 255);
(вот такое я понимаю )
А свет брать по максимуму (как у Минкса)
Кажись решилось, спасибо усэм
Теперь буду это имплементировать.
*бормочет под нос* Плюс попробовать придуманное решение пролемы с освещеним за стенкой в один блок...
_________________ У меня бисера не доxеpа.
Последний раз редактировалось: Shirson (17:51 04-09-2014), всего редактировалось 1 раз |
|
|
Minx 985 EGP
Рейтинг канала: 6(329) Репутация: 135 Сообщения: 10533 Откуда: Gomel, Belarus Зарегистрирован: 19.11.2005 |
|
Shirson : |
Нет никаких других вопросов, кроме как заданные в топикстарте - есть RGB-точка, на неё светит RGB-источник(и) света, как вычислить RGB-результат. Интересует только это.
|
Пациент: "Я понимаю Ширсона."
Доктор (роняя очки на стол): "Оп-паньки..."
(;
_________________ μηδείς αγεωμέτρητος εισίτω
Последний раз редактировалось: Minx (18:12 04-09-2014), всего редактировалось 1 раз |
|
|
Guest 2075 EGP
Рейтинг канала: 5(167) Репутация: 376 Сообщения: 27975 Откуда: Моск. Зарегистрирован: 12.10.2004 |
|
Olorin : |
resultColor = pointColor * Max(lightsColor.Select(c => c / 255.0).Sum(), 1.0) // для каждой компоненты
|
А единичка зачем? Этак у тебя получается, что при отсутствии освещения или слабом освещении точка имеет полностью свой цвет, то есть самосветима.
Shirson : |
Result := RGB(Color.R * Light.R / 255, Color.G * Light.G / 255, Color.B * Light.B / 255);
(вот такое я понимаю )
|
Да, только свет по всем источникам просуммировать (и удалённость от источника ещё наверное надо - а значит интенсивность каждого источника ещё делить на расстояние до точки, или на квадрат расстояния, или... ).
Ну то есть мега такая Result := RGB(Color.R * (Light1.R/Light1.Dist(point) + Light2.R/Light2.Dist(point) + ...) / 255, Color.G * (Light1.G/Light1.Dist(point) + Light2.G/Light2.Dist(point) + ...) / 255, Color.B * (Light1.B/Light1.Dist(point) + Light2.B/Light2.Dist(point) + ...) / 255);
_________________ Трещит земля как пустой орех
Как щепка трещит броня
Последний раз редактировалось: Guest (19:01 04-09-2014), всего редактировалось 1 раз |
|
|
|
|
|
Канал Игры Мечты: «Алгоритмические вопросы.» |
|
К списку каналов | Наверх страницы |
Цитата не в тему: Вот в последний месяц все на лазерные башни бросался, как киты на сушу от суицидальных позывов... (forbidden)
|
» Алгоритмические вопросы. | страница 1 |
|