Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 为公告牌渲染类似球体的法线(体积公告牌?)_Opengl_Glsl_Webgl - Fatal编程技术网

Opengl 为公告牌渲染类似球体的法线(体积公告牌?)

Opengl 为公告牌渲染类似球体的法线(体积公告牌?),opengl,glsl,webgl,Opengl,Glsl,Webgl,我有一个延迟渲染的粒子系统,我正在尝试改进布告牌法线贴图过程的生成。目前,我将布告牌法线渲染为前向Z。当灯光渲染过程绘制场景时,当BB面向灯光时,它们会与布告牌进行交互(如预期的那样) 以下是正常过程的外观: 这就像预期的一样。。。但是,我想更好地模拟粒子上的一种体积效应。我想把每一块广告牌都看成是一个球体。我的想法是,当球体的法线方向范围更广时,光线与粒子的相互作用会更好。例如,我想模仿这样的东西(白色边框将是一个单一的广告牌): 这是个好主意吗?我真的不知道该怎么做 编辑 我使用点进行

我有一个延迟渲染的粒子系统,我正在尝试改进布告牌法线贴图过程的生成。目前,我将布告牌法线渲染为前向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;

您的
gl_PointCoord
使用结果与您的期望不符的原因是
gl_PointCoord
的范围是0.0到1.0,而不是-1.0到1.0

只需减去0.5,使其平衡在0.0左右。如果还将其乘以2,则其范围为-1.0到1.0


您可能还想
规格化结果向量(不这样做可能会导致不必要的亮度变化,因为向量的长度因z分量固定为1.0而发生变化)。

您不能基于纹理坐标调整法线,以提供球形外观吗?嗨,Mokosha,是的,我想应该是这样的。我正在使用点精灵和gl_PointCoord,但我对如何实现它有点困惑。查看我的编辑。您可以将texcoord uv用作法线xy,如
normal.xy=texcoord.xy*2.0-vec2(1.0)
,然后
normal=normalize(normal)
。无论是否进行归一化,我认为都应该乘以2。减去1,而不是减去5。减法.5和标准化产生相同的结果,但解包不能作为通用函数(即使这不是一个字面函数,而是一个你的眼睛->大脑在最短时间内就能识别的函数),而且由于MAD,没有乘法并不能减少运算的数量。嗨,伙计们,你能看看我的编辑2吗。我展示了我使用的代码和屏幕截图。似乎有一些奇怪的人工制品,我认为它们与方程式有关。任何输入都会非常有帮助。没关系,我想我得到了(编辑3)。将此标记为已回答:)