Forum Replies Created
-
AuthorPosts
-
kd,ks,c都是定义的常数?这样的话不能量守恒啊(左=kd*c+ks*E(w_o), 不常为1)
所以作业文档里贴的图,prt显示的debug的图片也比js里的图亮啊(虽然图1,2不是同一个场景),而且文档里的图应该没乘kd/pi,其实给的参考图挺随意的
我说的第二种情况意思是:你在prt里没乘kd/pi,然后在shader.glsl里写的是的kd/pi *sum TransportSHCoeffs*LightCoeffs,所以导致两倍不一样。
如果你shader.glsl也是直接sum TransportSHCoeffs*LightCoeffs,感觉就是gamma矫正的问题了,prt里保存png时做了如图的空间转换,在js里pow(vColor, vec3(1.0/2.2))应该就得到差不多结果了?- This reply was modified 3 years, 6 months ago by cmc233.
Attachments:
You must be logged in to view attached files.作业 2
还是觉得tools.js的mat4Matrix2mathMatrix函数有问题,glmatrix的mat4是按列优先存储的,但mat4Matrix2mathMatrix读的时候是按行优先存储读的,mat4Matrix2mathMatrix返回的是原矩阵的转置
打印了一下结果也确实是转置了:
let v = mat4.create();
mat4.fromRotation(v, math.pi / 6, [0, 1, 0]);
let v_ = mat4Matrix2mathMatrix(v);
console.log(v_);0.8660253882408142, 0, -0.5, 0
0, 1, 0, 0
0.5, 0, 0.8660253882408142, 0
0, 0, 0, 1但是实际旋转矩阵应该是
0.8660253882408142, 0, 0.5, 0
0, 1, 0, 0
-0.5, 0, 0.8660253882408142, 0
0, 0, 0, 1两种可能
1.prt里存储成png图片时将线性空间转换到了sRGB空间 Color3f tonemapped = coeffRef(i, j).toSRGB();颜色计算给webgl的时候应该也得做相应的gamma矫正
2.prt里计算TransportSHCoeffs有乘以kd/pi吗?prt里Color3f Li()返回的是sum TransportSHCoeffs*LightCoeffs
好的,谢谢
测试了一下,的确是反的
不对,打印下来结果不对,例如取
let v = mat4.create();
mat4.fromRotation(v, math.pi / 6, [0, 1, 0]);
let v_ = mat4Matrix2mathMatrix(v);
console.log(v_);得到0.8660253882408142, 0, -0.5, 0
0, 1, 0, 0
0.5, 0, 0.8660253882408142, 0
0, 0, 0, 1但是实际旋转矩阵应该是
0.8660253882408142, 0, 0.5, 0
0, 1, 0, 0
-0.5, 0, 0.8660253882408142, 0
0, 0, 0, 1打印出来的确是没有问题的。
但是这是为什么啊,i*4+j是按行在读取,可glmatrix的文档里写mat4是按列存储的Attachments:
You must be logged in to view attached files.感觉文档在写推导公式的时候有点混淆SH系数和SH函数。框架提供的SHEval(x,y,z)返回的值是前l阶所有SH函数在w=(x,y,z)处的取值,但是推导过程中P指的是SH系数?这也是为什么第三步中不应该是M*原SH系数,而应该是原SH系数*M
天空盒子原来的方程是f(w),将整个盒子旋转R后的新盒子,相当于在w处的取值是原来R^(-1)*w处的取值,得到的新方程就是f(R*w)啊
我的推导只是将f(w)用球谐函数展开了啊,P就是球谐函数,lamda就是对应系数,为什么看不懂?我的推导也是基于文档中的性质二(而且这个性质才应该是球谐函数的旋转不变性,参见https://en.wikipedia.org/wiki/Spherical_harmonics#Rotations)
然后,我其实没看懂文档中列的第一个性质是什么意思图片第5行有个笔误,等式左边不应该是一个P(R^(-1) w),而是应该像右边一样是所有l阶SH的vector
不好意思,把 = (*shCoeff)[j]看成*= (shCoeff)[j]了,源代码好像是没乘系数orz
prt.cpp的preprocess()已经写了
auto shCoeff = sh::ProjectFunction(SHOrder, shFunc, m_SampleCount);
for (int j = 0; j < shCoeff->size(); j++)
{
m_TransportSHCoeffs.col(i).coeffRef(j) = (*shCoeff)[j];
}嗯,只是看到裙底结果很奇怪,就想问问诸如衣服这种薄物(或者一般非watertight的模型)是不是游戏里都会双面渲染。
至于伽马矫正,没有涉及到texture也需要伽马矫正吗?
更改一下,增加光源里,shader部分可能要有点小改动,例如新增一个#define NUM_LIGHTS 2.0,然后gl_FragColor = vec4(phongColor * visibility / NUM_LIGHTS, 1.0/ NUM_LIGHTS);这样blend的时候比较方便
增加光源:
一个很简单的做法是直接在webglRender.js里,对于同一个mesh,用gl.blendFunc把不同光源下画出来的结果给blend就行了(需要先在loadOBJ.js里把每个mesh不同的light下的meshRender和shadowMeshRender存下来),shader部分完全不用动;
比较麻烦的做法:改phongShader物体运动:
在engine.js的mainLoop()里更新mesh的translation,再直接用buildShadowMaterial()和buildPhongMaterial()计算新的material,赋值给renderer.shadowMeshes[i].material和renderer.meshes[i].material(具体写法可以参考loadOBJ.js);其中buildPhongMaterial需要用的colorMaps,mat.specular可以在loadOBJ.js里加行代码存下来This post has received 2 votes up.是啊,所以zReceiver = 500*coord.z+0.1*(1-coord.z)啊,你拿0.1/coord.z就没有意义啊(你下面的回复不是理解的挺清楚的吗,得在相机空间算距离比)。
ps,如果你在计算距离比的时候没有转化到相机空间,那么你计算blocker depth里fliter size要乘的(zReceiver – NEAR) / zReceiver可能也有问题,你的结果看上去没问题只是因为你的NEAR取的是0.1,而场景范围里按(0.1,500)得到的coord.z都是大于0.1的还有,突然想到,作业里shadow map推荐用的是正交投影,所以不会有“近大远小”;如果是用仿射投影的话,感觉这种想法是有道理的
你怎么归一化的nearplane?在0到1里,nearplane不是0吗?
代码里NEAR_PLANE/coord.z应该是NEAR_PLANE/(coord.z*FAR_PLANE + (1.0-coord.z)*NEAR_PLANE)吧?
按作业里的场景布置,对于阴影区域来说,NEAR_PLANE / zReceiver应该蛮小的吧,再乘以这个系数,阴影会变得很硬?感觉你是不是因为NEAR_PLANE设置的是0.1左右,所以用0.1/coord.z才能得到一个比较合适的缩小?纯属胡乱猜测,如果你coord.z已经做了空间转换就当我啥都没说orz一样的,本质都是将深度为0的背景判断出来。但是关于depth map背景深度是0这点感觉蛮奇怪的,看到的教程里绘制出来的depth map背景都是1(即背景都是白色)。感觉真正好的改法其实是在depth map存储时就将背景设置为1(这也符合逻辑,即没有object的地方深度最远),不过我对gl绘制是真地一点都不了解,看作业里的FBO.js和texture.js看得头秃,所以只能在调用depth map时增加判断把深度为0的当背景。
估计填写,保证在light坐标系下,由(left, right, bottom, top, near, far)构成的盒子能够包含整个场景,从而渲染出完整的shadow map就行
可以在phongVertex.glsl里令 gl_Position = vPositionFromLight;就可以可视化出shadow map渲染的范围几何分布算的是第k次成功,这里对应的就是第k次不会再弹射了,实际弹射就是k-1
感谢科普,要不是这个讨论,我还不知道Cook-Torrance是啥orz
我知道我俩沟通的问题在哪了。。。Cook-Torrance model和Microfacet model是两个不同的model,只是Cook-Torrance model的定义fr=kd*f_{Lambert}+ks*f_{cook−torrance}用到了microfacet,老师上课讲的microfacet只是单纯的microfacet吧
为啥这张图里的材质不能直接当成microfacet?(虽然感觉microfacet在金属上用的多些
不同材质模型加在一起当然能实现不同效果,可是,现在是要实现microfacet啊,而且,为啥一定要区分漫反射和镜面反射,对于microfacet来说,不就是崎岖的地和完全平滑的地吗
emmm,我这个独立指的是,有了microfacet就不用再算Lambert,Phong了,因为看你前面打算把他们加起来(可能我原话用的diffuse和specular让你误解了orz),所有材质的本质不都是brdf,即光怎么反射嘛233
-
AuthorPosts