Цвета в трассировщике лучей
От: 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);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.