|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
نويسنده |
پيغام |
johnsss در حال رشد
تاريخ عضويت: شنبه 2 ارديبهشت 1385 تعداد ارسالها: 33
4 شنبه 20 ارديبهشت 1385 - 11:23 |
|
|
@behrooz_pa
در ray tracing اگر متوجه شده باشيد ما با actual intersection point طرف هستيم که نشان دهنده اين است که کدام آبجکت (به طور دقيق و نه تقريبی) با چه اطلاعاتی (material, exact world location, exact normal vector) به برتو ما برخورد کرده. در نتيجه ميتونيم اون آبجکت رو دقيقا و کاملا -- در اون پيکسل -- illuminate بکنيم.
مشکل اصلی يا دليل اصلی image rendering چيه؟ اينکه برای هر پيکسل رنگ دقيق اون پيکسل رو پيدا کنيم و نشون بديم. با الگوريتمی که بالا نوشتم دقيقا همين کار رو ميکنه. اميدوارم که جواب خودتون رو گرفته باشيد.
اين هم قسمتی از کد ray tracer اي که من نوشتم برای پروژه دانشگاه. اميدوارم با اين کد بتونيد تا حدودی به نحوه کار آشنا بشيد:
كد: |
//-----------------------------------------------------------------
CColor CScene::Trace(CRay& ray, short depth) // the main loop of the algorithm. sending rays, shadow rays and child rays.
//-----------------------------------------------------------------
{
if (depth > maxDepth) return La;
CIntersection ip;
if (!FirstIntersect(ray, &ip)) return La;
CColor color = ip.object->ka * La;
color += DirectLightsource(ray.dir, ip); //illumination ray
CMaterial* pMaterial = ip.object;
CColor kr = pMaterial->kr;
if (kr.Luminance() > 0) {
Vector reflDir = ip.normal * ((float) -2.0 * (ray.dir * ip.normal)) + ray.dir; //reflection ray
color += kr * Trace(CRay(ip.point , reflDir), depth + 1);
}
CColor kt = pMaterial->kt;
if (kt.Luminance() > 0) {
Vector refrDir;
if (pMaterial->RefractionDir(ray.dir, refrDir, ip.normal)) //rafraction ray
color += kt * Trace(CRay(ip.point, refrDir), depth + 1);
}
return color;
}
//-----------------------------------------------------------------
CColor CScene::DirectLightsource(Vector& inDir, CIntersection& Ip)
//-----------------------------------------------------------------
{
CColor sumColor = CColor(0,0,0);
for (short i = 0; i < nlights; i++) {
CPointLight* pLight = lights[i];
CRay rayToLight(Ip.point , pLight->location - Ip.point);
float lightDist = rayToLight.dir.Length();
rayToLight.dir.Normalize();
float costheta = rayToLight.dir * Ip.normal;
if (costheta <= 0)
continue;
CIntersection ipToLight;
bool isIntersect = FirstIntersect(rayToLight, &ipToLight);
bool meetLight = !isIntersect;
if (isIntersect) {
Vector distIntersect = pLight->location - ipToLight.point;
if (distIntersect.Length() > lightDist)
meetLight = true;
}
if (!meetLight)
continue; // we are in shadow
CColor brdf = Ip.object->Brdf(inDir, rayToLight.dir, Ip.normal);
sumColor += lights[i]->emission * brdf;
}
return sumColor;
}
//intersection e aval ro dar inja beida mikonim! ke dar asl az KD-Tree intersection routine estefade mikone (optimization)
//-----------------------------------------------------------------
bool CScene::FirstIntersect(CRay& ray, CIntersection* ip) {
//-----------------------------------------------------------------
CIntersection iplocal1, iplocal2;
//bool res2= false;
if(kdTree->Intersect(ray, &iplocal1)) return true;
return false;
|
اين هم همون function که first intersection رو پيدا ميکنه ولی بدون استفاده از KD-Tree (در اصل brute force)
كد: |
//-----------------------------------------------------------------
bool CScene::FirstIntersect(CRay& ray, CIntersection* ip) {
//-----------------------------------------------------------------
ip->objectInd = -1;
float mint = FLT_MAX;
CIntersection ipLocal;
for (long i = 0; i < nobjects; i++) {
if(!objects[i]->Intersect(ray, &ipLocal))
continue;
if (ipLocal.t < mint) {
mint = ipLocal.t;
*ip = ipLocal;
ip->objectInd = i;
}
}
return ip->objectInd != -1;
}
|
@jack
قسمت اول که quote کرديد نميدونم آيا فکر ميکنيد که قسمت رياضيش خيلی سخته؟ برای اون کسی که اين رو اختراع کار شايد ولی خوندن و فهميدنش اسونه.
در مورد مقاله هم الان چک کردم، درست ميگيد. هرچند که اون مقاله از help مربوط به max برداشته شده ولی نسبتا توضيح جامع اي رو در مورد RT ميده (مرحله مقدماتی)
در بايان من اينجا نه با اسم اصلی اومدم و نه هيچ احتياج به تشکر يا چيزی دارم. تنها کاری که ميخوام بکنم کمک به دوستان ايرانی علاقمند به گرافيک و برنامه نويسی گرافيک هست. اگر به نظر شما من کمکی به شما نميکنم يا فکر ميکنيد که اين جا هستم برای اينکه چيزی به رخ کسی بکشم لطفا اينجا يا در پيام خصوصی بگيد. مطمئن باشيد که ديگه اينجا چيزی نخواهم نوشت اگر همچنين برداشتی رو داشته باشم که اين گونه من رو فرض ميکنيد. |
|
|
بازگشت به بالا |
|
|
|
|
|
|
|
|
|
|
|
صفحه 5 از 6 |
تمام ساعات و تاريخها بر حسب 3.5+ ساعت گرينويچ مي باشد برو به صفحه قبلي 1, 2, 3, 4, 5, 6 بعدي
|
|
شما نمي توانيد در اين انجمن نامه ارسال كنيد. شما نمي توانيد به موضوعات اين انجمن پاسخ دهيد شما نمي توانيد نامه هاي ارسالي خود را در اين انجمن ويرايش كنيد شما نمي توانيد نامه هاي ارسالي خود را در اين انجمن حذف كنيد شما نمي توانيد در نظر سنجي هاي اين انجمن شركت كنيد
|
|
|