Цвета в трассировщике лучей
От: Renim  
Дата: 02.04.03 16:13
Оценка:
Пишу трассировщик лучей, частично даже работает... точнее форма и тени
3d-объектов отрисовываеются правильно, а цвета получаются очень темными
(по сравнению c OpenGL) — на экране видны очень слабо (на черном фоне).
Может кто-нить подскажет в чем дело... Ниже приведен кусок сырца и
краткое описание используемых в нем классов и переменных.
=======================================================================
CVector3d — класс координатного фрейма (векторы и точки)
Для объектов этого класса определены все стандартные векторные операции
Подчеркну лишь то, что оператор & возвращает скалярное произведение.

CColor — класс цвета, содержит переменные 0<(float r,g,b)<1.
Как и для векторов, для этого класса определены все стандартные операции.
Опять же подчеркну лишь самое НЕочевидное: оператор CСolor ^ CColor
возвращает цвет, состоящий из произведений соотв. компонентов этих цветов

CMaterial — класс материала (содержит объекты CColor для диффузного,
зеркального, фонового и эмиссионного коэф-тов отражения а также
значение степени для вычисления зеркального коэф-та)

for (x=0;x<xRes;x++)
for (y=0;y<yRes;y++)
{
{...Вычисление параметров испускаемого луча...}
{...Определение ближайшего пересечения луча с каким-либо объектом,
В итоге получаем объект SurfacePoint, содержащий
номер 3d-объекта в сцене, номер грани, координаты точки соударения...}
{CMaterial mat = ... ;}
//mat — материал 3d-объекта в точке соударения (получаем из
// ID объекта и номера грани в SurfacePoint)
CVector3d s,m,v,r;
//s — направление на источник света;m — нормаль к поверхности
//v — направление на камеру; r — направление зеркального отражения
CColor PixColor=mat->emission;
for (int i=0;i<Scene->LightNum;i++)
{
m=Scene->pObj[SurfacePoint.ObjID]->GetNormal(SurfacePoint,Prepared);
s=Scene->pLight[i]->position-SurfacePoint.SurfPoint;
s.normalize();
v=eye-SurfacePoint.SurfPoint;
v.normalize();
r=-s+(2*(s&m))*m;
r.normalize();

PixColor=PixColor+(Scene->pLight[i]->diffuse^mat->diffuse)*fabs(s&m);
float Phong=pow(max(r&v,0),mat->specular_exp);
PixColor=PixColor+(Scene->pLight[i]->specular^mat->specular)*Phong;
PixColor=PixColor+Scene->pLight[i]->ambient^mat->ambient;
}
Canvas->SetPixel(x,y,PixColor);
}
Re: Цвета в трассировщике лучей
От: bask1907  
Дата: 01.10.03 07:40
Оценка:
Привет.
У меня тоже как-то была подобная проблема, не помню, как я это решил, давно дело было, лет пять назад...
Попробуй просто умножить полученный цвет на небольшую константу, чуть больше 1 (например, на 1.1). Можно принять эту константу за коэффициент отражения от поверхности тела, если ты такой ещё не вводил.
На самом деле, если писать полную модель метода трассирования лучей, то там полно всяких коэффициентов, прямо влияющих на результирующий цвет...

Басков Сергей.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.