李昌洲
@roland
李昌洲
@roland
-
正确与否要在验收的时候根据代码判断,目前从这张图看起来应该是没有什么问题的
Post #2 ❤️ 1 like -
8 线程给出的优化比例已经是比较宽的条件了,如果出现二分之一的情况,在优化思路没问题的情况下,可能是本身面片数较少,如果需要渲染的面片数较多还是出现这种情况,建议同学检查一下自己的优化思路是否还有优化空间
Post #2 -
这个需要检查一下同学你的坐标变换相关代码,如果说再渲染几个方向都能保证相机视角方向正确,那么就请检查一下你的变换矩阵是否不小心乘了某些常数,导致尺度发生了变化
Post #2 -
第一个问题请同学根据自己的实现思路自己思考哦;第二个问题如果 beta,gamma 不在 0 和 1 之间,说明并没有和这个三角形面片的内部相交,那么应当被判定为没有相交
Post #2 -
奥你指的更改是完成这个函数的意思吗?是需要完成的。我想成你在完成了函数之后的实验还需不需要更改了。如果不完成光线发射肯定无法实现光追的。我后续会在文档中写的更详细一些。
Post #2 -
没事不客气
Post #6 -
首先这种计算是典型的 phong shading 方式。那么为什么会这样,我的理解是:光源到片元的距离衰减是为了模拟漫反射时光源直射点和周围一圈一圈的光强衰减;而反射的损失是根据反射夹角来计算的。当然,这都是一种近似,并不完全准确,更准确的需要用到 ray tracing 用到的辐射能量学,计算方式是完全不同的,比如像同学你指出的镜面反射,有的时候也得考虑折射的损失,但这里同样不考虑
Post #4 -
这个好像是 z-buffer 反了造成的结果,请检查一下你的 z-buffer 的计算哦
Post #2 -
不需要改哦,只需要按要求更改需要更改的函数即可
Post #2 -
这一段是在讲 ray_triangle_intersect 的处理,也就是说这一步返回的结果就需要转化为世界坐标系,而 AABB::intersect 应该不需要考虑这个问题。
Post #3 -
由于每个三角形内部的颜色完全一样,说明插值肯定有问题,请检查一下你的插值获得的重心坐标的三个分量是否正确,以及插值函数所使用的参数是否正确
Post #2 ❤️ 1 like -
漫反射不需要递归,只有全反射需要递归,但是只有反射的光线进入人眼,才可以被看见
Post #3 -
这个跟运行的设备有关系,2.4 加上了 bvh,你可以和 2.3 对比一下,如果有加速且加速明显,就说明实现的基本正确
Post #5 -
算,但是你的全反射效果显然有一些问题,反射出的图像是散的点
Post #4 -
渲染时间不算特别离谱,因为没有加速结构,同时输出大量数据,如果实在太慢可能是递归光线出现了问题。而反射出的点比较奇怪可能是递归光线的过程出现了问题,建议可以再检查一下自己的递归逻辑是否正确
Post #2 -
不能够,因为全反射涉及到很多重要的方法使用,而阴影仅仅涉及到光线的判定,如果没有全反射,则可以获得 5 分。同学可以试着调整光源和相机位置,看一看能否出现反射
Post #2 -
如果镜面的材质还是一片黑,可以调整一下光源和相机的位置,如果仍然无法出现反射,那么需要检查一下全反射的实现逻辑以及法线方向是否存在问题
Post #6 ❤️ 1 like -
没太明白你的意思同学。在这个实验框架中,分为全反射和漫反射。全反射是 shinness>1000 的情况,漫反射是>0 且<1000 的情况,漫反射不代表没有反射。
Post #2 -
我用 debug 模式的话可能需要 20s 左右,一点都没动肯定不正常
Post #2 -
你这个变化方式意思是直接在光线的方向偏移了 0.5 倍的光线向量吗?这个偏移量属实有点大了。你的这个效果有点奇怪,如果是没有插值法线的结果,照理说每个面片的颜色应该是一样的,你不妨检查一下你的法线是否在哪一步不小心进行了改变,或者加载出现了问题
Post #2 -
你的遍历考虑掉了左右子树之一是空,而另一侧还有子节点的情况,不妨改了之后再试一试
Post #2 -
是的,不需要插值,可以获得满分
Post #2 -
那说明你的 view 矩阵没有正确加载,同学可以检查一下是哪里没有正确加载
Post #2 -
你的第二幅图是出现了什么状况呢?是没有计算出光暗变化吗?如果是这样的话检查一下法线的变化。另外,想确定问题到底在哪里,不妨使用一下最简单的模型,如一个正方体,输出几个顶点坐标的位置,包括其 z-buffer 的值,用来判断到底哪里有问题
Post #2 -
Emmmm,这个当时没有特别记录,只要能体现出阴影和反射就好,位置不需要一样
Post #2 -
同学可以查看一下之前的帖子以及习题课的视频,包括更新后的文档,t 可以不进行变化,在任何一个坐标系中求得均可,之前的文档写的有些问题,后续进行了更新
Post #2 -
你可以按照自己的理解写,最后并没有明确的规定亮度,只要高光和 diffuse 看着是正常的就好,ambient 本身就是一种近似,所以并没有准确的规定
Post #2 -
第一张的感觉光源的亮度也不正常,同学可以检查一下第一张图到底是什么导致了光强不正确,比如可能是坐标计算,或者 attenuated_light 之类的计算出现了问题
Post #2 -
是的,着色的这三项如果加起来超过了 255,由于最后着色的时候采用的是无符号字符变量进行存储,会导致溢出,所以会出现黑色,所以像@geezmo 说的一样,截断即可
Post #3 -
这个问题应当是你的编译器版本较低造成的,请尝试使用更新的编译器。
Post #2 -
同学,注意到你的光线的方向向量和起点坐标在变为齐次坐标时,都是添加的 1。而事实上,坐标值确实应当添加 1,而向量则应当添加 0。
Post #5 -
你的计算过程我推了一下,应该是没问题的。你的实际实现代码里的 T 是 ray.origin-a 吗,如果是的话,那么你目前展示出的代码应该没太大问题,除了返回的法线方向,这个是需要你自己重新计算的,不是直接取这个 mesh 的 normal
Post #7 -
如果一直返回 std::nullopt,说明一直没有相交,那同学你可以检查一下是否发生过任何一次相交。如果一次都没有发生或者只有偶尔几次,说明求解出的光线的方向存在问题。如果发生的次数很正常,那就是在相交后的处理存在问题
Post #4 -
同学你的代码思路是没问题的,会不会是你的返回值有点问题?
Post #2 -
在模型坐标系中求解得到结果后,返回的时候需要再乘以 model 得到返回值,这个结果像是有关模型坐标系的变换出现了一些问题
Post #3 -
首先是你确实更新了 z-buffer。那么在着色的时候,是否检查了 z-buffer 呢?另外,在计算着色时,是否考虑了光强的衰减,每一个像素点的法线是否都是重心坐标插值得到的,请仔细对照检查一下
Post #2 -

正常运行的结果应该长这个样子。可以看到在最大的包围盒内,由于有些区域不存在面片,所以不会出现细分的包围盒。你的结果应该是把所有的区域都划分到了最细,所以碰撞检测不存在问题,但是效率存在问题,需要更改成正确的实现方式Post #2 -
感觉像是你的 z-buffer 是否没有更新,只是进行了检查?导致本应该在后面不被着色的跑到前面来了,或者是你的 specular 计算方式存在一些问题?
Post #2 -
同学你可以检查一下你的 result 计算的时候,是否在某一步除了零,可以单独输出一下 ambient,diffuse 和 specular 看一下
Post #2 -
Cast_ray 这个函数是递归的,你的程序运行结果像是没有递归边界,导致段错误了
Post #2 -
如果程序的写法正确,shiness 应该会返回更改后的结果。也许是在返回 result 之前没有对 result 中的 shiness 进行有效更改,或者在场景中有多个物体时,输出的 shiness 是其他未更改物体的 shiness,再或者是出现了错误的相交判断,从而导致输出了默认值
Post #2 -
对于第一个问题,颜色成块状是因为在求解光线与平面相交时,每个像素点返回的法线是三角形面片的法线。这点和 phong shading 用到的法线插值情况是不一样的。phong shading 里面有插值,而这里只要求返回面片法线,所以过渡不均匀,是正常现象。
对于第二个问题,相机位置是一定会改变最后的渲染结果的,同学可以检查一下,是否是不小心做了归一化或者其他什么操作,导致最后结果一样了Post #2 -
可以看看在遍历三角形内部的点的时候,是否有考虑边界情况
Post #2 -
这个 width 和 height 指的是屏幕空间,也就是最后呈现的图像的长宽,可以通过渲染前的 ui 界面调整,不调整的话就是默认值,所以不变
Post #3 -
同学,首先是你的点光源应该放在了牛的左侧较近的地方 (如果没有的话,就是坐标变换出了问题)。其次是你的 fragement shader 应该没有使用 phong shading,所以出现了每个三角形面片内部都是完全相同颜色的情况
Post #2 -
这个情况我没遇到过,同学你可以单独渲染使用 diffuse,specular 以及 ambient 看看效果是怎么样的。我猜测问题可能出现在你的点的剪裁遍历上面
Post #3 -
如果只在漫反射或者高光上出现问题,那应该就是用到的法线向量或是点光源发射的光线向量出现了问题,你可以输出一下他们的值看看是否存在异常
Post #4 -
可能当时写文档时截图已经文档导入时图片有一些失真,按预编译版本即可。只要高光区域对,就说明实现的思路方法基本正确。
Post #2 -
这里可能出现的问题很多,比如你的 newtriangle 创建出现问题,或者 rasterize_triangle 内部实现出现问题,都可能产生闪退
Post #3 -
同学可以检查一下自己中间的计算过程中有没有出现异常值。如果单独输出任何一种光都出现这种情况,可以思考一下和着色直接相关的步骤中,比如 z-buffer 的判断上,是否存在问题
Post #2