我有一个延迟渲染粒子系统,我试图改善法线贴图法线的生成。目前我将广告牌法线渲染为面向前方的Z.当灯光渲染过程中绘制场景时,当BB面向灯光时(如预期的那样),它们与广告牌交互。
这是正常传递的样子:
这可以按预期工作......但是我想更好地模拟粒子上的一种体积效应。我想对待每个广告牌,就像它更像是球体一样。我的想法是,当球体具有更宽范围的法线方向时,与粒子的光照相互作用会更好。即我喜欢模仿这样的东西(白色边框将是一个单一的广告牌):
这是个好主意吗?我真的不知道如何去做。
修改
我使用点进行渲染,我目前的想法是这样的:
normal.x = gl_PointCoord.x;
normal.y = gl_PointCoord.y;
normal.z = 1.0;
但gl_PointCoord似乎没有产生我认为它的效果。截图如下:
编辑2
大家好,我似乎还有问题。我现在使用的GLSL如下:
vec3 normal = vec3( gl_PointCoord.x * 2.0 - 1.0, 1.0 - gl_PointCoord.y * 2.0 , length(gl_PointCoord.xy) );
normal = normalize( normal );
但它似乎仍然不是100%。在大多数情况下,它似乎运作良好。但是,当我使用面向广告牌的定向灯时,您会发现问题。
好像虽然左下方的蓝色法线不正确。如果你看常规球体法线,左下角的蓝色渐变为黑色(表示缺少z功率)。我认为这仍然是缺少的。有什么想法吗?
编辑3
弄清楚出了什么问题。在我正常通过期间,我忘记正确编码法线,然后稍后解码。
// Encoding pass
vec3 normal = vec3( gl_PointCoord.x * 4.0 - 2.0, 2.0 - gl_PointCoord.y * 4.0, 1.0 );
normal = normalize( normal );
normal = normal * 0.5 + 0.5;
// Decoding pass
vec3 normal = texture2D( normalMap, vUv ).xyz;
normal = normal.xyz * 2.0 - 1.0;
答案 0 :(得分:1)
gl_PointCoord
使用情况并非如你所愿,是因为gl_PointCoord
的范围是0.0到1.0,而不是-1.0到1.0。
只需减去0.5即可平衡0.0。如果你也将它乘以2它的范围是-1.0到1.0。
您可能还希望normalize
生成的矢量(由于z分量固定为1.0,因此矢量长度发生变化时,不这样做会导致不必要的亮度变化。)