【发布时间】:2014-11-13 22:31:58
【问题描述】:
我有一个延迟渲染粒子系统,我正在尝试改进广告牌法线的生成以用于法线贴图传递。目前,我将广告牌法线渲染为朝前的 Z。当灯光渲染通过绘制场景时,它们与广告牌交互,因此当 BB 面向灯光时(如预期的那样)。
下面是普通通道的样子:
这按预期工作......但是我想更好地模拟粒子上的一种体积效应。我想把每个广告牌都当作球形来对待。我的想法是,与粒子的照明交互会更好,因为球体具有更广泛的法线方向。 IE。我想模仿这样的东西(白色边框是一个广告牌):
这是个好主意吗?我真的不知道该怎么做。
编辑
我是用点来渲染的,我现在的想法是这样的:
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;
【问题讨论】:
-
你不能根据纹理坐标调整法线以提供球形外观吗?
-
嗨 Mokosha,是的,我在想这样的事情会是这样。我使用点精灵和 gl_PointCoord,但我对如何实现它有点困惑。查看我的编辑。
-
您可以将 texcoord uv 用作普通 xy,例如
normal.xy = texcoord.xy * 2.0 - vec2(1.0),然后是normal = normalize(normal)。