渲染球体像广告牌的法线(体积广告牌?)

时间:2014-11-11 21:27:42

标签: opengl glsl webgl

我有一个延迟渲染粒子系统,我试图改善法线贴图法线的生成。目前我将广告牌法线渲染为面向前方的Z.当灯光渲染过程中绘制场景时,当BB面向灯光时(如预期的那样),它们与广告牌交互。

enter image description here

这是正常传递的样子:

enter image description here

这可以按预期工作......但是我想更好地模拟粒子上的一种体积效应。我想对待每个广告牌,就像它更像是球体一样。我的想法是,当球体具有更宽范围的法线方向时,与粒子的光照相互作用会更好。即我喜欢模仿这样的东西(白色边框将是一个单一的广告牌):

enter image description here

这是个好主意吗?我真的不知道如何去做。

修改

我使用点进行渲染,我目前的想法是这样的:

   normal.x = gl_PointCoord.x;
   normal.y = gl_PointCoord.y;
   normal.z = 1.0;

但gl_PointCoord似乎没有产生我认为它的效果。截图如下: enter image description here

编辑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 );

enter image description here

但它似乎仍然不是100%。在大多数情况下,它似乎运作良好。但是,当我使用面向广告牌的定向灯时,您会发现问题。

enter image description here

好像虽然左下方的蓝色法线不正确。如果你看常规球体法线,左下角的蓝色渐变为黑色(表示缺少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;

1 个答案:

答案 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,因此矢量长度发生变化时,不这样做会导致不必要的亮度变化。)

相关问题