基于OGRE实现的光线跟踪算法的问题
bool CMyTraceListener::FillPixelBuffer(size_t &width,size_t &height)
{
Ogre::TexturePtr texPtr=Ogre::TextureManager::getSingleton().getByName("MyTraceTex");
if(!texPtr.isNull())
{
texPtr->getBuffer(0,0)->lock(Ogre::HardwareBuffer::HBL_DISCARD);
const Ogre::PixelBox &pb=texPtr->getBuffer(0,0)->getCurrentLock();
Ogre::uint32 *data = static_cast<Ogre::uint32*>(pb.data);
height= pb.getHeight();
width = pb.getWidth();
size_t pitch = pb.rowPitch;
for(size_t y=0; y<height && y<512; ++y)
{
for(size_t x=0;x<width && x<512 ;++x)
{
Vector3 color=Tracer(m_vecRay[512*y +x],1); //开始光线跟踪
data[pitch*y +x]=D3DXCOLOR(color[0],color[1],color[2],1.0);
}
}
texPtr->getBuffer(0,0)->unlock();
}else
{
texPtr = Ogre::TextureManager::getSingleton().createManual(
"MyTraceTex",
"General",
Ogre::TEX_TYPE_2D,
600, 600,
0, Ogre::PF_A8R8G8B8);
if(texPtr.isNull())
return false;
texPtr->getBuffer(0,0)->lock(Ogre::HardwareBuffer::HBL_DISCARD);
const Ogre::PixelBox &pb=texPtr->getBuffer(0,0)->getCurrentLock();
Ogre::uint32 *data = static_cast<Ogre::uint32*>(pb.data);
height= pb.getHeight();
width = pb.getWidth();
size_t pitch = pb.rowPitch;
for(size_t y=0; /*y<height && */y<=512; ++y)
{
for(size_t x=0;/*x<width &&*/ x<=512 ;++x)
{
Vector3 color=Tracer(m_vecRay[512*y +x],1);//开始光线跟踪
data[pitch*y +x]=D3DXCOLOR(color[0],color[1],color[2],1.0);
}
}
texPtr->getBuffer(0,0)->unlock();
}
IDirect3DTexture9 *pTex = static_cast<Ogre::D3D9Texture *>(&*texPtr)->getNormTexture();
char buf[100];
int i=0;
sprintf_s( buf , "../auto_texture_%d.png" , i ) ;
D3DXSaveTextureToFileA( buf , D3DXIFF_PNG , pTex , NULL ) ;//保存结果到文件
//创建OGRE材质
Ogre::MaterialPtr pMat=Ogre::MaterialManager::getSingleton().create("MytraceMat",Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
if(pMat.isNull())
return false;
pMat->getTechnique(0)->getPass(0)->createTextureUnitState("MyTraceTex");
pMat->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureFiltering(Ogre::FO_LINEAR,Ogre::FO_LINEAR,Ogre::FO_NONE);
pMat->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setColourOperation(Ogre::LBO_ALPHA_BLEND);
pMat->getTechnique(0)->getPass(0)->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
pMat->getTechnique(0)->getPass(0)->setCullingMode(Ogre::CULL_NONE);
return true;
}
光线跟踪的函数:
Vector3 CMyTraceListener::Tracer(Ray ray,int depth)
{
Vector3 color=Vector3::ZERO;
Ray Reflect;
double distance = 10000;
for(int i=0;i<m_vecObject.size();++i)
{
if(m_vecObject[i]->isIntersected(ray,distance) == CGObject::INTERSECTED)
{
Vector3 p = ray.getPoint(distance);
Reflect.setOrigin(p);
Vector3 rayDir = ray.getDirection();
Vector3 N = m_vecObject[i]->GetNormal(p);
Vector3 rayRelDir=rayDir.reflect(N);
//rayRelDir = -rayRelDir;
Reflect.setDirection(rayRelDir);
N.normalise();
for(int j=0;j<m_vecLight.size();++j)
{
Vector3 ambient = m_vecLight[j]->EvalAmbient(m_vecObject[i]->GetKa());
Vector3 L = m_vecLight[j]->GetPosition() - p;
L.normalise();
Vector3 diffuse = m_vecLight[j]->EvalDiffuse(m_vecObject[i]->GetKd(),
N,L);
Vector3 V = m_vCamPos - p;
V.normalise();
Vector3 specular = m_vecLight[j]->EvalSpecular(m_vecObject[i]->GetKs(),
m_vecObject[i]->GetSininess(),N,L,V);
color = ambient+diffuse+specular;
}
}
}
if(m_iTotalDepth == depth)
return color;
else
{
Vector3 c = Tracer(Reflect,++depth);
color += color*c;
return color;
}
}
//创建用于查询的光线的函数
bool CMyTraceListener::InitTraceRay(float width,float height)
{
for(int y=0;y<=height;++y)
for(int x=0;x<=width;++x)
{
float pixel_x = -20.0 + 40.0/width*x;
float pixel_y = 20.0 - 40.0/height*y;
Vector3 dir = Vector3(pixel_x,pixel_y,0) - m_vCamPos;
dir.normalise();
Ray ray;
ray.setDirection(dir);
ray.setOrigin(m_vCamPos);
m_vecRay.push_back(ray);
}
return true;
}
如图:

相关推荐
3D游戏图形光照技术.ppt
"3D游戏图形光照技术.ppt - 介绍3D游戏图形中的光照计算原理,包括局部和全局光照模型,以及Direct3D光照应用。文件内容涉及三维几何变换、绘制流程、OpenGL/Direct3D的三维变
园区管理如何通过数据分析提升招商效率与运营质量?.docx
科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。
央企如何利用数据分析工具优化科技研发方向与产业布局?.docx
科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。
基于ADMM应用于水蜜桃采摘配送联合优化问题研究(Matlab代码实现)
内容概要:本文研究了基于交替方向乘子法(ADMM)的水蜜桃采摘与配送联合优化问题,并提供了完整的Matlab代码实现。通过构建整合农业生产中采摘任务分配与物流配送路径规划的数学模型,采用ADMM算法进行分布式求解,显著提升了计算效率与问题扩展性。文中系统阐述了问题建模过程、目标函数与约束条件的设计、ADMM算法的迭代求解机制,并通过仿真实验验证了该方法在降低整体运营成本与提升供应链响应速度方面的有效性,为智慧农业背景下的农产品供应链一体化优化提供了理论支持与实践范例。; 适合人群:具备一定运筹优化、农业工程或物流管理基础知识,熟悉Matlab编程的高校研究生、科研人员及农业科技企业技术人员。; 使用场景及目标:①应用于智慧农业场景下的作物采摘与冷链物流联合调度;②作为学习ADMM算法在分布式优化中应用的教学案例;③为解决类似农产品供应链优化问题提供模型与代码参考; 阅读建议:建议读者结合提供的Matlab代码逐模块阅读,重点关注问题建模与ADMM算法实现部分,可通过修改参数或测试不同规模案例来加深理解,并尝试将其拓展至其他农作物或更复杂的供应链网络中。
新能源纯电动汽车驾驶员模块、整车控制器、减速器模块、车速模块等建模Simulink仿真模型
内容概要:本文详细介绍了一个基于Simulink的新能源纯电动汽车仿真模型,重点涵盖了驾驶员模块、整车控制器、减速器模块和车速模块等核心部件的建模与仿真。该模型采用模块化设计理念,实现了对电动汽车动力传动系统与整车控制逻辑的高精度模拟,可用于车辆动力学分析、控制策略验证及系统性能评估。模型紧密结合工程实际需求,构建了完整的仿真框架,支持在不同驾驶工况(如加速、减速、爬坡等)下测试车辆动态响应,有效提升了整车控制系统的设计效率与可靠性,具有较强的工程应用价值。; 适合人群:具备一定车辆工程或自动化背景,从事新能源汽车控制、系统仿真或机电一体化研究的研发人员及高校研究生。; 使用场景及目标:①用于新能源汽车整车控制策略的开发与验证;②支持动力系统匹配分析与性能优化;③适用于教学演示、科研项目及工程原型开发中的动态仿真需求。; 阅读建议:建议使用者熟悉Simulink基本操作与车辆动力学基础知识,结合实际控制需求逐步调试各模块参数,并通过典型工况(如加速、减速、爬坡)验证模型的有效性与稳定性。


图形处理/算法
