Home › Forums › GAMES在线课程(现代计算机图形学入门)讨论区 › [作业7] 只考虑直接光照的结果
- This topic has 29 replies, 8 voices, and was last updated 4 years, 7 months ago by 欠你一枝花.
-
AuthorPosts
-
-
hello各位老师同学,我想先通过实现直接光照来查看效果,
在这里,对使用
Scene::sampleLight(p, pdf_light);
这块还是没太能理解,请各位大佬帮忙看下,非常感谢!我的实现是这样的:
1. 找到
p
点, 即要渲染的点。
2. 如果p
点存在, 则根据p
的入射方向和法线方向, 用sample
和pdf
函数得到出射方向的pdf_light
这个float型的值(这是概率密度)?
3. 根据第2步的pdf_light
,调用Scene::sampleLight(p, pdf_light)
, 因为其背后对应的各个Object的Sample
成员函数对传入的p
进行了修改, 我将其理解为经过Scene::sampleLight
后, p点就是在光源上采样的点了.
4. 根据作业说明, 我将x
,NN
等属性从p
中直接获取,然后再判断新的光线p2x相交等,进行光照计算.代码和结果在附件中,不知道有没有什么问题~
另外,在Renderer.cpp中,不清楚下面这个写法有没有问题:
for (int k = 0; k < spp; k++){
framebuffer[m] += scene.castRay(Ray(eye_pos, dir), 0) / spp;
// fixme: 是不是我这样写才对?
// framebuffer[m] += scene.castRay(Ray(eye_pos, dir), 0);
}
// framebuffer[m] = framebuffer[m] / spp;- This topic was modified 4 years, 7 months ago by 欠你一枝花.
- This topic was modified 4 years, 7 months ago by 欠你一枝花.
Attachments:
You must be logged in to view attached files. -
Zhixiong RenParticipant
那个 background 需要自己换成黑色
我计算光强时是用 Emit 除以距离的平方再乘上的,好像才能得到和例子相似的颜色, 否则颜色会过亮(只有黑色和白色),当成 Intensity 量来用。
Emission 的单位好像是 RLU,不能和物理量直接相互转换。
- This reply was modified 4 years, 7 months ago by Zhixiong Ren.
-
谢谢大佬,距离的平方是啥意思? 是p2x的距离的平方?
-
Zhixiong RenParticipant
就是我用 (Emit / (x – wo).square()) 乘上了后面的,后面的公式和你一样。
你可以先只算一个直接光照的,看下效果,对了的话左右两侧的红绿墙应该会出来的。
- This reply was modified 4 years, 7 months ago by Zhixiong Ren.
-
公式里不是本就有一个距离平方吗?你是需要再除一个距离平方?
This post has received 1 vote up.-
Zhixiong RenParticipant
是的,我除了公式里的距离平方,又多除了一个距离的平方
谢谢助教,我查看一下哪里算错了
-
Zhixiong RenParticipant
我是在光第一次反射的时候,多除了一次距离的平方,然后得到的如下的效果
请问 Intersection 中的 emit 是什么单位?
Attachments:
You must be logged in to view attached files. -
Zhixiong RenParticipant
我在公示 Li 的位置多除了 d2 才能显示出相似的颜色,不除的 d2 颜色会过亮,只有黑白
还是没看出来哪一步错了
- This reply was modified 4 years, 7 months ago by Zhixiong Ren.
Attachments:
You must be logged in to view attached files. -
Zhixiong RenParticipant
我找到原因了,是因为 ws 计算后没有 normalize,所以正好多出了距离的平方倍
-
-
我的结果不是的, 还是一片蓝天白云…
童鞋能帮忙看看我附件的代码吗? 万分感谢…-
Zhixiong RenParticipant
castRay 里面如果没有光返回
我的第一步算直接光照的,是上面那样判断的
obj 对象在 intersect 的时候加了赋值,默认没有赋值,其他同学好像是用范围判断的我修改的是 ws 赋值是单位方向
Vector3f ws = normalize(lightIsect.coords – isect.coords);
-
-
-
你的代码里面错误太多了。
比如wo这个入射方向不就是ray.direction么?
关于你的2,课堂已经讲过了,如果是直接光照的话,不要从p点采样出射光线的方向,而是看哪些光源能照到这里。
具体做法就是:sampleLight实在光源上采样一个发光点,然后你从p点到发光点判断有没有遮挡。This post has received 1 vote up.- This reply was modified 4 years, 7 months ago by 禹鹏(助教).
-
谢谢大佬啦~, 您的意思是不是:
1. 着色点p的入射方向
wo = p.coords
换成wo = ray.direction
, 但是p.coords就是origin+t*dir, 也就是说,p.coords
与ray.direction
不是一样的吗?2. 通过调用
sampleLight(p, pdf_light)
, 其中p
是变为光源上的1个采样点, 把它的坐标叫做x, 即光源上的采样点x
=p.coords
, 那么就通过2个点来构建1个ray_p2x
的Ray实例来判断其与场景是否相交, 不太清楚这块是哪里错了.麻烦大佬帮我点播一下, 真的太谢谢了!
-
Zhixiong RenParticipant
wo = -ray.direction
pdf(wi, wo, rayIsect.normal)-
1. 位置和向量的概念不一样的。方向这个问题注意正负号。
2. sampleLight你看一下定义,第一个参数是个Intersection,是这个函数算出来的。也就是光源上采样点的信息。-
好的谢谢老师, 我明天再调调看
-
Zhixiong RenParticipant
感谢,我检查一下这里
-
-
-
Zhixiong RenParticipant
我的
ws = lightIsect.coords – rayIsect.coords
rayIsect 是传进来射线打到的非光源物体,lightIsect 是利用 sampleLight 的光源采样点This post has received 1 vote down.-
直接光照的结果(物体的阴影没显示出来。。。)
Attachments:
You must be logged in to view attached files.-
Zhixiong RenParticipant
wo = -ray.direction 有个负号,是从照射点朝向眼睛的方向
-
改了之后效果一模一样…
开/关OpenMP的效果也是一样的…
实在是犯蒙…
-
-
-
-
改了之后效果一模一样…
开/关OpenMP的效果也是一样的…同学能加个qq吗? 我的: 314913739
This post has received 1 vote up. -
我觉得你的错应该是判断是否能直接打到光源那里有问题
-
我的天… 是
Bounds3::IntersectP
的问题, 我原来的判断条件是t_enter <= t_exit && t_enter >= 0
, 应该改为t_enter <= t_exit && t_exit >= 0
-
樱井小暮Participant
请问没有阴影还有可能是什么原因呢?我intersectp里判断条件没有问题。
-
老兄解决好了吗?
-
解决了~
-
-
-
-
-
楼主,想请问一下关于happened这个属性,究竟是和什么碰撞,在最初的条件中应该是属于和场景边缘还是?之后又用测试光的这个属性判断是否与物体相交,有点不理解具体含义了
-
在这里例子里其实没啥用,因为助教大佬们把光源也当成1个物体了,那你碰撞到其它物体还是”光源”, 本质上没啥区别.
-
-
-
AuthorPosts
- You must be logged in to reply to this topic.