【问题标题】:Render sphere like normals for billboard (volumetric billboard?)像广告牌的法线一样渲染球体(体积广告牌?)
【发布时间】: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)

标签: opengl glsl webgl


【解决方案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 而发生变化)。

【讨论】:

  • 不管你是否归一化,我认为你应该乘以 2 减去 1,而不是减去 0.5。减去 .5 和归一化会产生相同的结果,但解包不能作为通用函数(即使这不是字面函数,而是你的眼睛-> 大脑在最短时间识别的函数),由于 MAD,缺少乘法并不会减少运算次数。
  • 大家好,请看一下我的编辑 2。我已经展示了我使用的代码以及屏幕截图。我认为似乎有一些奇怪的人工制品与方程式有关。任何意见都会非常有帮助。
  • 没关系,我想我明白了(编辑 3)。将其标记为已回答:)
猜你喜欢
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多