标签: lighting

改进了WebGL和ThreeJS中的区域照明

我一直在研究WebGL中的区域照明实现,类似于这个演示:

http://threejs.org/examples/webgldeferred_arealights.html

以上在three.js中的实现是从gamedev.net上的ArKano22的工作中移植出来的:

http://www.gamedev.net/topic/552315-glsl-area-light-implementation/

虽然这些解决方案非常令人印象深刻,但它们都有一些局限性.ArKano22最初实现的主要问题是漫反射项的计算不考虑曲面法线.

几个星期以来,我一直在增加这个解决方案,使用redPlant的改进来解决这个问题.目前我将正常的计算结合到解决方案中,但结果也存在缺陷.

以下是我当前实施的预览:

区域照明预告片

介绍

计算每个片段的扩散项的步骤如下:

  1. 将顶点投影到区域光所在的平面上,以使投影向量与光的法线/方向一致.
  2. 通过将投影矢量与光线法线进行比较,检查顶点是否位于区域光平面的正确一侧.
  3. 从光的中心/位置计算该投影点在平面上的2D偏移.
  4. 夹住此2D偏移矢量,使其位于灯光区域内(由其宽度和高度定义).
  5. 导出投影和夹紧2D点的3D世界位置.这是区域光到顶点的最近点.
  6. 通过获取顶点到最近点矢量(标准化)和顶点法线之间的点积来执行通常的点光计算.

问题

该解决方案的问题在于,照明计算是从最近的点完成的,并且不考虑光表面上可能照亮片段的其他点.让我试着解释一下为什么......

请考虑以下图表:

有问题的区域照明情况

区域光线垂直于表面并与之相交.表面上的每个碎片将始终返回表面和光相交的区域光上的最近点.由于曲面法线和顶点到光线矢量总是垂直的,因此它们之间的点积为零.随后,尽管在表面上隐藏着大面积的光,但漫射贡献的计算为零.

潜在解决方案

I propose that rather than calculate the light from the nearest point on the area light, we calculate it from a point on the area light that yields the greatest dot product between the vertex-to-light vector (normalised) and the vertex normal. In the diagram above, this would be the purple dot, rather than the …

math 3d lighting webgl three.js

59
推荐指数
1
解决办法
9600
查看次数

计算在基于图块的游戏中点亮哪些图块("光线跟踪")

我正在写一个基于平铺的小游戏,为此我想支持光源.但是我的算法太弱了,所以我来找你帮忙.

情况是这样的:有一个基于图块的地图(作为二维阵列保存),包含一个光源和几个站在周围的物品.我想计算哪些瓷砖被光源点亮,哪些瓷砖处于阴影中.

大约是它的外观的视觉辅助.L是光源,X是阻挡光线的项目,0是点亮的瓷砖,-s是阴影中的瓷砖.

0 0 0 0 0 0 - - 0
0 0 0 0 0 0 - 0 0
0 0 0 0 0 X 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 L 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 X X X X 0 0
0 0 0 - - - - - 0
0 0 - - - …
Run Code Online (Sandbox Code Playgroud)

algorithm raytracing lighting

43
推荐指数
4
解决办法
2万
查看次数

Minecraft如何进行照明?

我熟悉的唯一模型是漫射光,但这看起来比这更复杂.

opengl rendering lighting real-time minecraft

24
推荐指数
2
解决办法
6998
查看次数

与Three.js的现实照明(阳光)?

我正在尝试使用Three.js创建一个小型的第一人称游戏,但我遇到了照明问题.基本上我想要模拟太阳并让它围绕着所有东西的投射光旋转.我现在正在使用THREE.DirectionalLight,它只照亮了一个方向,所以立方体的两侧保持黑/暗.

我是否必须使用多个灯才能点亮一切?或者我可以以某种方式反射地面/物体的光线?

lighting three.js

18
推荐指数
2
解决办法
2万
查看次数

OpenGL中的Oren-Nayar照明(如何计算片段着色器中的视图方向)

我试图实现奥伦-纳亚尔照明在片段着色器如图所示这里.

但是,我在地形上得到了一些奇怪的灯光效果,如下图所示.

我目前正在向着色器发送"查看方向"制服作为相机的"前"向量.我不确定这是否正确,因为移动相机会改变工件.

将"前"矢量乘以MVP矩阵可以得到更好的结果,但是从某些角度观察地形时,人工制品仍然非常值得注意.在黑暗区域和屏幕边缘尤其明显.

什么可能导致这种影响?

神器的例子

在此输入图像描述

场景应该如何

在此输入图像描述

顶点着色器

#version 450

layout(location = 0) in vec3 position;
layout(location = 1) in vec3 normal;

out VS_OUT {
    vec3 normal;
} vert_out;

void main() {
    vert_out.normal = normal;
    gl_Position = vec4(position, 1.0);
}
Run Code Online (Sandbox Code Playgroud)

Tesselation控制着色器

#version 450

layout(vertices = 3) out;

in VS_OUT {
    vec3 normal;
} tesc_in[];

out TESC_OUT {
    vec3 normal;
} tesc_out[];

void main() { 
    if(gl_InvocationID == 0) {
        gl_TessLevelInner[0] = 1.0;
        gl_TessLevelInner[1] = 1.0;

        gl_TessLevelOuter[0] = 1.0;
        gl_TessLevelOuter[1] …
Run Code Online (Sandbox Code Playgroud)

c++ opengl lighting glsl

11
推荐指数
1
解决办法
849
查看次数

漫反射光/阴影

我刚刚在我的引擎中实现了一个灯光系统.在下面的屏幕截图中,您可以看到正在运行的灯光(黄色方块):

1 考虑到在照亮场景的光线之上,它还实现了一个FOV,它会遮挡你视野之外的任何东西.这就是为什么阴影的左侧部分看起来如此偏离.

正如你所看到的那样,光线的阴影非常"坚硬",因为它们甚至不能照亮其直接范围之外的一个区域.为了使灯光看起来更好,我对它们应用了一个过滤器,它几乎限制了要照明的范围,并且在该限制范围内略微照亮了该区域:

2

在大黄色圆圈中,即使没有直射光照射,您也可以看到该区域是如何照亮的.

然而,该解决方案带来一些不希望的副作用.正如您在下面的屏幕截图中看到的那样,即使没有任何光到达某个区域,如果它太靠近光源,它也会被点亮:

10

我想知道是否有任何方法可以通过正确使用着色器来实现我想要做的事情.我遇到的主要问题来自于我如何绘制这些阴影.

1)首先,我采用光线范围内的结构.

此时,我正在使用顶点,因为它们定义了阴影投射项的区域: 3

2)然后,对于这些对象中的每一个,我计算它们单独投射的阴影: 4

五

6 他们施放的阴影由CPU完成,通过计算身体每个顶点的投影.

3)然后GPU将这些形状绘制到纹理中以构成最终阴影:

7

我发现的问题是,制作这种弥散阴影效果,我需要最后的阴影.如果我在步骤2)中计算漫射阴影,则在固体B和C之间会出现光隙.

但是如果我在第3步中消除了阴影,我就不再拥有顶点信息,因为我拥有的所有信息都是在一个最终纹理中加起来的3个局部纹理.

那么,无论如何要实现这一目标吗?我的第一个想法是将变量传递给碎片器以计算有多少光进入暗区,但由于我将在最终阴影上处理此信息,因为它没有顶点信息,我完全迷失了什么我应该用这个做法.

我对这种方法可能完全错了,因为我对着色器的经验非常有限.

这是我现在拥有的一个例子,以及我想要的东西:我拥有的东西:光线半径的明亮照明(导致光线穿过墙壁. 7

我想要的是:距离光线结束的距离越远,阴影越强烈. 7

opengl lighting glsl shadow game-engine

9
推荐指数
1
解决办法
650
查看次数

OpenGL灯限制

当我阅读RedBook时,我一直很困惑,openGL在场景中最多可以有8个灯(数量取决于实现,但应该是8周围).

但是我可以想象一些需要更多灯光的情况,所以我认为游戏开发中有一个技巧.

例如,你有很长的街道有50个strretlights,或者你可以有20个人的小队都使用手电筒.你如何模拟这些情况?有一个问题,光线只会照亮网格的一部分,而不是光源和物体之间的整个圆锥体,因此如果我们没有100%的清洁空气,也必须进行某种模拟.这样做的方式是什么,游戏运行顺畅?(我还读到所有8个灯都能杀死FPS)

opengl lighting

8
推荐指数
2
解决办法
7696
查看次数

基于平铺的剔除概念问题的延迟渲染

编辑:我仍在寻找有关使用OpenCL或计算着色器的一些帮助.我更喜欢继续使用OGL 3.3并且不必处理对OGL 4.3和OpenCL 1.2的坏驱动程序支持,但我无论如何都不能想到这种类型的着色而不使用其中一个(用于匹配灯和砖).是否可以在不使用GPGPU的情况下实现基于区块的剔除?

我在OpenGL 3.3中编写了一个延迟渲染.现在我没有对光通道进行任何剔除(我只为每个灯光渲染一个全屏四边形).这(显然)有很多透支.(有时它是~100%).因此,我一直在研究在光通过期间提高性能的方法.似乎(几乎)每个人的意见中最好的方法是使用屏幕空间图块来剔除场景.这是Frostbite 2中使用的方法.我在SIGGRAPH 2010期间阅读了Andrew Lauritzen的演示文稿(http://download-software.intel.com/sites/default/files/m/d/4/1/d/8 /lauritzen_deferred_shading_siggraph_2010.pdf),我不确定我是否完全理解这个概念.(为此,为什么它比其他任何东西都好,如果它对我更好)

在演示中,Laurtizen通过轻量,四边形和瓷砖进行延迟着色,以剔除场景.根据他的数据,基于区块的延迟渲染器是最快的(到目前为止).我不明白为什么会这样.我猜这与事实有关,即每个瓷砖都将所有灯光一起分批.在演示文稿中,它说要读取G-Buffer一次然后计算光照,但这对我来说没有意义.在我看来,我会这样实现:

for each tile {
  for each light effecting the tile {
    render quad (the tile) and compute lighting
    blend with previous tiles (GL_ONE, GL_ONE)
  }
}
Run Code Online (Sandbox Code Playgroud)

这仍然需要对G-Buffer进行大量采样.我认为这样做会产生与为每个灯光渲染四边形屏幕相同(如果不是更差)的性能.从它的措辞来看,似乎这就是发生的事情:

for each tile {
 render quad (the tile) and compute all lights
}
Run Code Online (Sandbox Code Playgroud)

但我没有看到如何在不超过某些GPU上片段着色器的指令限制的情况下执行此操作.谁能帮我这个?看起来几乎每个基于tile的延迟渲染器都使用计算着色器或OpenCL(批量灯),为什么会这样,如果我没有使用它们会发生什么?

opengl lighting culling deferred-rendering deferred-shading

8
推荐指数
1
解决办法
2230
查看次数

高效的基于2D瓷砖的照明系统

在Java中为基于磁贴的引擎进行照明的最有效方法是什么?
是否会在瓷砖后面放置黑色背景并更改瓷砖的alpha?
或者把黑色前景改成那个?还是其他什么?

这是我想要的那种照明的一个例子:
http://i.stack.imgur.com/F5Lzo.png

java 2d lighting tile

8
推荐指数
2
解决办法
6878
查看次数

iOS SceneKit Neon Glow

一直在寻找Scenekit上的灯光,虽然我现在可以应用一个灯光节点来点亮我正在寻找一种从物体内发光的方法.

举一个例子,想象一下霓虹灯发光,或者在其他物体上投射光线的灯泡.

任何想法如何实现这一目标?

非常感谢.

lighting effects ios scenekit swift

8
推荐指数
2
解决办法
5265
查看次数