Forum Replies Created
-
AuthorPosts
-
我用的办法比较笨,是直接对材质里的一个属性进行判断的,你说的这个我具体不记得了,不过应该也是可以的吧:)
This post has received 1 vote down.对的
This post has received 1 vote down.不是,这个你画个图就知道了,要判断具体是取正取负你得搞清楚各个物理量的含义
This post has received 1 vote up and 1 vote down.Attachments:
You must be logged in to view attached files.顺便提一句,用castRay的参数ray获取它打到的物体之后记得判断一下Scene::intersect的返回值的happened是否是0,是0的话代表没打到任何物体直接返回Vector3f(0.0f)就行了
不然会报段错误,因为材质是null的话用Material::eval和Material::sample的时候会出错ps:楼主的理解是对的
This post has received 1 vote down.- This reply was modified 4 years, 7 months ago by 戴皓天.
谢谢助教!昨晚搞了半天,一次渲染都要十几分钟,结果东改改西改改渲染几次图出来都是全黑的😂
原来是这里疏漏了,改了就好了,太粗心了😂This post has received 1 vote down.游戏引擎的默认渲染管线使用的方法都是光栅化,unity要用光线追踪的话得用HDRP,RTX光线追踪是嵌套在HDRP里的,UE4没用过不知道,不过应该也是有的:)
在排序仍然用sort的情况下,用不用SAH在渲染时间上差别确实不是特别明显,对于你的那个复杂模型在总时间上还是不用SAH的更少一点(BVH with SAH建树时间太长),或许面对更大更复杂的场景SAH才能发挥出更大作用XD
This post has received 1 vote down.Attachments:
You must be logged in to view attached files.假设光源在O1,方向就朝箭头方向
此时为了举例就先看x方向上的计算
那么此时pMin.x-O1.x<0,因为此时dir.x<0
所以min_tx此时求出来本身是大于0的
再看图,这个O1出发的光线明显是会经过bound的,所以哪怕dir是负的你也不应该取反再假设光源在O2
看x方向
此时pMin.x-O1.x>0,因为此时dir.x<0
所以min_tx此时求出来本身是<0的,
但是如果按你说的取反,min_tx就>0了,就变成光能够通过bound了
但是由图可知这个光线如果在O2出发,那么是不可能经过bound的所以总之我认为不应该取反,直接交换min和max的位置就行了
- This reply was modified 4 years, 7 months ago by 戴皓天.
Attachments:
You must be logged in to view attached files.第三张图也就是4-3.PNG,那个
if(!dirIsNeg[x])
里面不用取反,直接交换两者就行了,如果方向是负的说明他就是超这个方向照射的,如果算出来t是负的那么说明光线是不经过这个box的,你这样似乎就弄反了,你可以试着画个图这个资料很简单,很好理解,但是实际上开销比较大,最好还是要按空间划分,而不是按我这个教程的按物体划分,因为可能有些场景会有大量物体,不过用于理解还是很好的,我就是看这个文章看懂的原理:)
This post has received 1 vote down.非常感谢!!!这样说就懂了~
This post has received 2 votes down.大佬你好,可以请教几个问题吗
SAH的原理我已经理解了,就是现在对实现上还有点疑惑
1.我对老师提供的教程有点疑惑,具体见附件,也就是这段代码(括起来的三行),能否解答一下这一部分具体是在进行怎样的操作?
2.教程里,在空间中buckets是如何分割出来的?比如此时objects中所有物体构成的包围盒在z轴上最长,那么此时是如何在z轴上对空间进行分割的?如果是等分成32分,那么是对哪一段长度进行32等分?(这个问题或许可以合并到第一个问题里)ps:我看了另一个教程,这个教程说的是,比如一共有10个物体,在z轴上按z轴大小排好序,分别编号为0~9,然后在这10个物体之间取分割线,比如先在0、1之间分割,然后再1、2之间分割,以此类推,算出各个cost(cost指的就是分割后两个子包围盒的[子包围盒体积/父包围盒体积*子包围盒中物体数量]的和,这里和老师提供的教程是一样的),然后采用最小的那个,这个教程与老师提供的教程的区别就是并不是对空间进行分割,实际上是对物体数量进行分割,不知道我这样行不行,但我想先弄懂老师提供的教程是什么意思
谢谢了!
This post has received 1 vote up.- This reply was modified 4 years, 7 months ago by 戴皓天.
- This reply was modified 4 years, 7 months ago by 戴皓天.
Attachments:
You must be logged in to view attached files.非常感谢!
之前对框架里obj的赋值感到很疑惑,卡了好久,这样一说就明白了感觉几年以后差不多等我研究生毕业的时候工业界真的就已经完全告别光栅化了,前辈们太强了,真心佩服
- This reply was modified 4 years, 7 months ago by 戴皓天.
谢谢,我用你计算颜色的方法试了下,确实比我的效果要好,非常感谢提供思路
(第一幅是Δt取0.001,第二幅是Δt取0.0001
左右分别是用距离/根号2 和 两距离之比算相邻像素颜色的效果)Attachments:
You must be logged in to view attached files.你找临近点的方式我理解了,其实就是类似“四舍五入”找基准点吧,跟我的做法差不多
好的谢谢。
我刚才试了3X3的,效果不好,因为各个方向用同样的方式模糊的话反而不怎么理想Attachments:
You must be logged in to view attached files.非常感谢你的解答!
你这样计算颜色可能会比我好一点,我把分母固定作根号2会导致一些小问题
不过你这样算的话我有几个疑问:
1、始终取曲线点所在的像素作为基准点,向左侧和下侧取另外三个点做模糊,这样会不会导致模糊在方向上不均匀?因为始终是往左下角模糊,右上角永远是纯色(这一点是不是改成寻找曲线点所在的像素点四周的八个像素点构成总共3X3个像素点就行了?因为毕竟这样各个方向上都有做模糊处理)
2、取最大值是个很不错的想法,但是如果背景不是黑色,或者在绿线之后有其他颜色是不是就没法处理了?比如先画一条红线再画绿线,那这样的话是不是就会有问题,因为颜色作为Vec3b拥有RGB三个通道,比大小的话就没有实际意义了果然是重复计算的问题
因为我在做反走样之前为了增强反走样之前线条的连续性,我把t的增量改小了很多,我改回0.001就好了,就有效果了,但是这个问题暂时没能得到根本解决,还有待思考附件是我改了t增量之后的效果
Attachments:
You must be logged in to view attached files.我发现问题所在了,我之前线条太粗是因为t每次的增量取得太小了,t的增量太小会导致计算出来的贝塞尔曲线上的点非常多,这就进一步导致了一个像素周围有非常多的贝塞尔曲线的点,这就导致了很多重复计算,因为我的算法是对每一个要曲线上的点做的,所以当一个像素周围有很多点时,会逐个计算每一个点以及其四周的颜色,这样就导致了线条很粗,模糊的话也会被覆盖
如果t增量取小一点的话,最理想是一个像素里只有一个点,每个像素(除了曲线本身在的哪个像素)都只计算一次颜色
我现在把t的增量改小一点,改到框架默认的0.001效果就出来了
但是不知道这个“像素内或者像素周围有多个点会导致重复计算”的问题实质上应该怎么解决可以问几个问题吗,麻烦你了
1.反走样是在画每个点的时候处理的吗?还是说先把曲线每个点记录下来,在后期处理反走样?
2.用距离来涂色的方式是怎样的呢?我的做法是:
颜色比例 =(计算出来的曲线上的点 到 像素中心的距离)/根号2
像素颜色 = 像素颜色*比例 + 曲线颜色*(1-比例)
我这里的像素指的是曲线上的点周围的四个像素中的其中一个像素,如果要填色的话肯定是对这四个像素做一个遍历,我上面提到的这个公式每个都计算一遍,根号2是因为前面提到的这个距离的最大值就是根号2,也就是四个像素中心点连线构成的正方形的对角线,但是效果非常差,主要是模糊效果没出来,我这样光是让曲线变粗了很多,模糊的话只有少部分像素有,现在不知道应该如何改进啊啊抱歉前几天太忙了,没看到帖子!
我刚才也正好在做。。但是效果出不来:(
具体见附件吧,虽然边缘有一些地方确实有一点模糊,但是总体上来说模糊的地方还是太少了,大部分地方都是满满的绿色,导致线条很粗,而且锯齿仍然存在,效果很差
我目前的思路是每次对点画颜色之前,找到当前点的周围的四个像素,for(对于周围四个像素中的每个像素p) { 比例 = 当前点到像素p的中心的距离/根号2;//除以根号2是因为当前点到周围任何一个像素中心的距离肯定是小于根号2的,想象一下,四个像素,它们的中心点的连线,最长就是对角线,也就是根号2,当前点肯定是在这四个中心点连线形成的正方形内,所以距离一定会小于这个对角线 像素p的颜色 = 像素p的颜色*比例 + 当前点需写入的颜色*(1-比例);//当前点需写入的颜色也就是绿色 }
但是效果也就这样了。。我再思考一下吧。。
ps:还有个疑问,就是贝塞尔曲线计算出的点可能比较密集,或许会出现很多点在同一个像素内部的情况,或者出现某些像素周围聚集了很多曲线上的点的情况,如果按照我这个思路的话,对于每个曲线上的点都要做一次计算,这样是不是会导致很多像素点被重复计算,因此导致了很多地方颜色太深而显得线条很粗且没有什么模糊?
- This reply was modified 4 years, 8 months ago by 戴皓天.
Attachments:
You must be logged in to view attached files.好的谢谢助教~
这是框架问题,一开始是老师为了简化问题所以才这么做的,实际上应该是要初始化为负无穷的
(我自己就是改的负无穷这样的话,你求出来的法线应该会和按作业框架来而求出来的不一样,但是局部坐标系只是暂时用的,只是用来方便利用切线求微分而已,最后把这个法线应用到顶点上还是需要通过逆矩阵转换回原坐标系,所以本质上应该是一样的吧,怎么取应该都可以(这里我指的是逆矩阵,而不是矩阵的转置是因为一开始我不知道这样在满足右手系的情况下调换顺序会不会导致这个转换矩阵不再是正交矩阵,但是我刚才随便举了个例子算了下,正交矩阵在调换顺序之后仍然满足正交矩阵的性质,所以应该来说你这样只要满足右手系,随便怎么换顺序都是可以用转换矩阵的转置来得到逆转换矩阵)
(当然了,如果说的宽泛一点的话,其实不满足右手系也可以,只要你转换回原坐标系时保证用的是转换矩阵的逆矩阵即可)看来就是这样了😂
毕竟原贴图(指小贴图)在脚蹄子那里质量就很差劲老师的意思估计是保存渲染图+原模型吧
-
AuthorPosts