Opencl 使用路径跟踪渲染体素时出现问题

Opencl 使用路径跟踪渲染体素时出现问题,opencl,raytracing,voxel,Opencl,Raytracing,Voxel,我目前正在使用c和open cl开发pathtracer。 我正在使用算法进行渲染。第一次碰撞效果很好,但是,从第二次碰撞开始,体素下侧有一个暗影 这是初始光线击中的体素的颜色: 这是第二条光线击中的体素的颜色: 这是渲染到1000深度后的结果: 这是我使用的代码(openCL): int cast_-ray(渲染器*r、光线、浮动3*hitPos、int3*普通、材质*Material){ int3体素=转换_int3(光线原点); int3步骤={ (射线方向x>=0)?1:-1, (

我目前正在使用c和open cl开发pathtracer。 我正在使用算法进行渲染。第一次碰撞效果很好,但是,从第二次碰撞开始,体素下侧有一个暗影

这是初始光线击中的体素的颜色:

这是第二条光线击中的体素的颜色:

这是渲染到1000深度后的结果:

这是我使用的代码(
openCL
):

int cast_-ray(渲染器*r、光线、浮动3*hitPos、int3*普通、材质*Material){
int3体素=转换_int3(光线原点);
int3步骤={
(射线方向x>=0)?1:-1,
(光线方向y>=0)?1:-1,
(射线方向z>=0)?1:-1
};
浮动3 tMax={
(ray.direction.x!=0)?(voxel.x+step.x-ray.origin.x)/ray.direction.x:MAXFLOAT,
(ray.direction.y!=0)?(体素.y+step.y-ray.origin.y)/ray.direction.y:MAXFLOAT,
(ray.direction.z!=0)?(体素.z+step.z-ray.origin.z)/ray.direction.z:MAXFLOAT
};
浮动3 tDelta={
(光线方向x!=0)?1/光线方向x*步长x:MAXFLOAT,
(光线方向y!=0)?1/光线方向y*step.y:MAXFLOAT,
(光线方向z!=0)?1/光线方向z*步长z:MAXFLOAT
};
内侧;
而(1){
如果(tMax.xx=(浮动)体素.x;
hitPos->y=ray.origin.y+(hitPos->x-ray.origin.x)*ray.direction.y/ray.direction.x;
hitPos->z=ray.origin.z+(hitPos->x-ray.origin.x)*ray.direction.z/ray.direction.x;
*法线=(int3){-step.x,0,0};
打破
案例1:
hitPos->y=(浮动)体素.y;
hitPos->x=ray.origin.x+(hitPos->y-ray.origin.y)*ray.direction.x/ray.direction.y;
hitPos->z=ray.origin.z+(hitPos->y-ray.origin.y)*ray.direction.z/ray.direction.y;
*正规=(int3){0,-step.y,0};
打破
案例2:
hitPos->z=(浮动)体素.z;
hitPos->y=ray.origin.y+(hitPos->z-ray.origin.z)*ray.direction.y/ray.direction.z;
hitPos->x=ray.origin.x+(hitPos->z-ray.origin.z)*ray.direction.x/ray.direction.z;
*法线=(int3){0,0,-step.z};
打破
}
返回1;
}
}
float3获取颜色(渲染器*r,光线){
3个掩模=1;
float3颜色=0;
int maxDepth=1000;
对于(int i=0;irng);
射线=(射线){hitPos,方向};
遮罩*=材质。颜色;
}否则如果(material.type==3){
float3方向=反射方向(光线方向,fNormal)+随机单位向量(r->rng)*材质模糊;
射线=(射线){hitPos,方向};
遮罩=遮罩*(1-材质.tint)+遮罩*material.color*material.tint;
}
}否则{
颜色=遮罩*r->bgColor;
打破
}
//如果(i==1)
//返回材料。颜色;
}
返回颜色;
}
我认为问题在于光线的新原点不知何故是不正确的,但我找不到修复它的方法