资源简介
使用光线光线算法实现的光线跟踪效果图
有阴影和反射效果,采用Phong光照模型

代码片段和文件信息
#include “raytracer.h“
#include “scene.h“
#include “common.h“
#include “windows.h“
#include “winbase.h“
namespace Raytracer {
Ray::Ray( vector3& a_Origin vector3& a_Dir ) :
m_Origin( a_Origin )
m_Direction( a_Dir )
{
}
Engine::Engine()
{
m_Scene = new Scene();
}
Engine::~Engine()
{
delete m_Scene;
}
/*************注释*************
作用:设置渲染目标
******************************/
void Engine::SetTarget( Pixel* a_Dest int a_Width int a_Height )
{
// 设置像素缓冲区的地址和大小
m_Dest = a_Dest;
m_Width = a_Width;
m_Height = a_Height;
}
/*************注释*************
作用:初始化渲染器,跳过标题栏,并预先计算一些值
******************************/
void Engine::InitRender()
{
// 越过窗口栏的20个像素,即跳过标题栏
m_CurrLine = 20;
// 设置像素缓冲区的第一个像素地址
m_PPos = 20 * m_Width;
// 屏幕平面在世界坐标系的位置
m_WX1 = -6 m_WX2 = 6 m_WY1 = m_SY = 4.5 m_WY2 = -4.5;
//计算插值△x△y
m_DX = (m_WX2 - m_WX1) / m_Width;
m_DY = (m_WY2 - m_WY1) / m_Height;
m_SY += 20 * m_DY;
//为前面行分配空间存储指向图元的指针
m_LastRow = new Primitive*[m_Width];
memset( m_LastRow 0 m_Width * 4 );
}
/*************注释*************
作用:从左至右发射屏幕的扫描的光线,渲染场景的物体
******************************/
bool Engine::Render()
{
//渲染场景的起始点
vector3 o( 0 0 -5 );
//初始化时钟
int msecs = GetTickCount();
//重置上一个找到的图元指针
Primitive* lastprim = 0;
// 渲染剩余的行
for ( int y = m_CurrLine; y < (m_Height - 20); y++ )
{
m_SX = m_WX1;
//渲染当前行像素
for ( int x = 0; x < m_Width; x++ )
{
//发射跟踪光线
Color acc( 0 0 0 );
vector3 dir = vector3( m_SX m_SY 0 ) - o;
NORMALIZE( dir );
Ray r( o dir ); //跟踪光线
float dist;
Primitive* prim = Raytrace( r acc 1 1.0f dist );
int red = (int)(acc.r * 256);
int green = (int)(acc.g * 256);
int blue = (int)(acc.b * 256);
if (red > 255) red = 255;
if (green > 255) green = 255;
if (blue > 255) blue = 255;
m_Dest[m_PPos++] = (red << 16) + (green << 8) + blue;
m_SX += m_DX;
}
m_SY += m_DY;
//渲染世界场景是否超过0.1s
if ((GetTickCount() - msecs) > 100)
{
//更新屏幕,把控制权交给windows
m_CurrLine = y + 1;
return false;
}
}
return true;
}
Primitive* Engine::Raytrace( Ray& a_Ray Color& a_Acc int a_Depth float a_RIndex float& a_Dist )
{
if (a_Depth > TRACEDEPTH) return 0; //大于设置的追踪深度返回
a_Dist = 1000000.0f; // 追踪光线最大长度
vector3 pi;
Primitive* prim = 0;
int result;
for ( int s = 0; s < m_Scene->GetNrPrimitives(); s++ ) // 找到最近相交的图元
{
Primitive* pr = m_Scene->GetPrimitive( s );//当前图元
int res;
if (res = pr->Intersect( a_Ray a_Dist ))
{
prim = pr;
result = res; // 0 = miss 1 = hit -1 = hit在图元内部检测到相交
}
}
//没有相交,结束光线
if (!prim) return 0;
//处理光线与图元相交
if (prim->IsLight())
{
// 碰到光源,结束光线
a_Acc = Color( 1 1 1 ); //为白色光源
}
else
/*
计算从相交点(pi)到光源(L)的向量,并用这个向量和相交点的单位向量的叉积来计算
出光源的亮度。这个计算出的亮度是元素朝向光源的那一点被光源照亮,而其他点就是
阴暗的了。叉积大于0为了防止面与光源反向
*/
{
// 决定相交点的颜色
pi = a_Ray.GetOrigin() + a_Ray.GetDirection() * a_Dist; //相交点 a_Dist的长
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 4176 2010-06-20 19:13 RayTracer\raytracer.dsp
文件 541 2004-07-08 16:04 RayTracer\raytracer.dsw
文件 99328 2010-06-23 18:47 RayTracer\raytracer.ncb
文件 1392 2010-06-23 18:47 RayTracer\raytracer.plg
文件 478 2010-06-23 18:47 RayTracer\raytracer.positions
文件 2911 2010-06-20 20:37 RayTracer\scene.h
文件 235 2010-06-20 12:04 RayTracer\testbyOGL.cpp
文件 237633 2010-06-23 18:47 RayTracer\Debug\raytracer.exe
文件 478 2010-06-20 22:42 RayTracer\surface.cpp
文件 517 2010-06-20 22:42 RayTracer\surface.h
文件 5863 2010-06-20 22:42 RayTracer\raytracer.cpp
文件 1265 2010-06-20 22:43 RayTracer\raytracer.h
文件 4728 2010-06-20 22:43 RayTracer\scene.cpp
文件 3666 2010-06-20 22:44 RayTracer\common.h
文件 3538 2010-06-23 18:47 RayTracer\testapp.cpp
文件 49664 2010-06-23 18:47 RayTracer\raytracer.opt
文件 237633 2010-06-23 18:47 RayTracer\raytracer.exe
文件 52732 2010-06-23 18:47 RayTracer\效果图.jpg
目录 0 2010-06-20 22:40 RayTracer\Debug
目录 0 2010-06-20 22:40 RayTracer
----------- --------- ---------- ----- ----
706778 20
相关资源
- 背景差分法 多目标跟踪
- mtrace 源码
- 基于OPENGL的光线跟踪源代码368758
- 相干与非相干实现捕获与跟踪GPS
- 图书管理系统需求跟踪矩阵表.rar
- 基于误差四元数的钻孔姿态跟踪控制
- 多目标跟踪MOT16_Benchmark数据集链接
- 项目开发计划与跟踪汇总表模板
- MSC 船公司:MSC 船公司货物跟踪查询
- 塔式太阳能热发电中的定日镜跟踪系
- 基于meanshift和粒子滤波的目标跟踪代
- 华为LTE M2000后台网管信令跟踪说明
- 自拍用于目标跟踪的红外图像序列
- 画跟踪精确度图的程序.zip
- 一种新型基于多点预瞄的最优路径跟
- 自动驾驶车辆LQR轨迹跟踪控制器设计
- 在一张图上画多个跟踪框.zip
- 负载智能跟踪监控技术在皮带运输系
- 论文研究-基于修正积分卡尔曼粒子滤
- 目标跟踪中用到的各种深度学习方法
-
翻译:ob
ject Tracking: A Survey,物体跟 - 扩频通信,解扩解调,pn码捕获跟踪
- 粒子滤波视频目标跟踪程序文档
- ArduPilot——L1 control 中文翻译版
- 红外目标跟踪测试视频
- 机动目标跟踪、信息融合希望有用
- 机动目标跟踪pdf格式
- 多目标假设跟踪MHt.doc
- 近两年跟踪速度较快的算法
- Zemax 光线输出光斑整形光源的选择问
评论
共有 条评论