【问题标题】:Calculating the position on spotlight cone in Phong shader在 Phong 着色器中计算聚光灯锥上的位置
【发布时间】:2014-12-30 01:29:24
【问题描述】:

我正在尝试在 WebGLRenderer 的 PhongMaterial 中为 THREE.SpotLight 实现光 cookie(或图案图案、光纹理或光蒙版)。目的是能够为灯光附加纹理,如下所示:http://www.idjnow.com/ProductImagesLarge/GOBO-GLASS1C.jpg 纹理会降低灯光的强度,从而产生类似阴影的投影。

我认为我已经涵盖了“将纹理附加到灯光并将其作为统一传递以在着色器中查找”,尽管无法对其进行测试,因为我在计算聚光灯锥中的位置时遇到问题/ 点。

我看到这里计算了聚光灯的光贡献(我是直接修改 Three.js 源,而不是创建我自己的材质):

https://github.com/mrdoob/three.js/blob/master/src/renderers/WebGLShaders.js#L1013

聚光灯的位置是一个圆圈,对吧?或椭圆,如果它在一个角度。所以我需要在这里添加一些代码,它会告诉我我在聚光灯下的位置(xy 坐标)。我可以将这些坐标映射到纹理查找上,相应地降低 spotDiffuse,并希望有工作的图案投影。

我如何计算这些与每盏灯相关的坐标?

或者有没有更好的方法在 Three.js 中实现光饼干/图案/光纹理/光蒙版?我看到它是游戏引擎中的一个流行功能,如果有这样的内置功能会很好。 http://docs.unity3d.com/Documentation/Components/class-Light.html 很好地描述了我正在寻找的内容(cookie 部分)。

【问题讨论】:

    标签: three.js


    【解决方案1】:

    看看这里:http://www.evpopov.com/threejstest/test_spot_projtexture.html

    我认为它正在做你想做的事。

    它实际上是标准的投影纹理,除了纹理不是“按原样”使用而是衰减光照计算。

    对于这个示例,我使用了投影纹理的 Alpha 通道作为衰减因子。

    为了创建我使用的顶点/片段着色器,我从 phong 材质中获取了顶点/片段着色器,并且只保留了聚光灯渲染的相关部分。我还设置了一个恒定的环境颜色以避免出现黑色区域​​(在斑点范围之外)。

    如果您想在自己的着色器中重用它,投影纹理的特定代码在顶点/片段着色器中具有以 // 开头的 cmets。

    您还必须生成与您的灯光相对应的投影矩阵:makeProjectiveMatrixForLight 函数会为您完成 => 它与您在三个用于阴影映射的 JS 源代码中找到的代码几乎相同。

    启动示例时,墙壁旋转,聚光灯保持固定。您可以通过将moveLightTarget 更改为true 来使聚光灯的目标移动,在这种情况下,您需要将rotateCube 设置为false 以更好地了解发生了什么。

    【讨论】:

    • 太棒了,非常感谢!看起来它与我想要的完全或非常接近:) 一旦我研究了足够确定的代码,我就会接受。
    • 以防我的网站被关闭,这里是 jsfiddle:jsfiddle.net/evgeni_popov/mekyV/2
    • 实际上,我在调整它以使用 Three.js 内置着色器代码时仍然遇到问题。尝试使用texture2DProj(gobos[i], goboprojection[i]); 访问纹理时遇到很多错误(WebGL: INVALID_OPERATION: vertexAttribPointer: no bound ARRAY_BUFFER and WebGL: INVALID_OPERATION: drawElements: attribs not setup correctly )(纹理在数组统一中)。我敢肯定这只是一些愚蠢的脑残,而且我越来越接近了……如果我无法解决它,可能是另一个问题的主题,只是提到这一点,以防您根据此信息发现一些明显的错误:)
    • 在我看来很难使代码适应内置着色器代码,因为您必须乘以着色器代码内的投影仪衰减...我认为您确实会有创建一个新问题并在那里发布一些代码。
    • 旧的 jsfiddle 热链接到 github。 jsfiddle.net/mekyV/33 这是一个使用来自 CDN js 的 THREE.js 64 的版本
    猜你喜欢
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2023-03-26
    • 2013-12-27
    • 2012-05-24
    相关资源
    最近更新 更多