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_Graphics_3d_Transparency_Shadow - Fatal编程技术网

Opengl 如何模拟透明对象的数学校正阴影?

Opengl 如何模拟透明对象的数学校正阴影?,opengl,graphics,3d,transparency,shadow,Opengl,Graphics,3d,Transparency,Shadow,我想模拟复杂和复合透明对象投射的阴影。 对于特定光源(至少对于点光源),此阴影必须在数学上正确。我认为这对任何图形库都是正确的,是吗? 然后,绝对不能有任何折射 当然,这张照片不是我真正想要的 OpenGL能做到这一点吗?如果不能,我应该用什么来代替呢 UPD.所以我需要一些路径跟踪器。是否有一些我可以用编程的方法:给它一个3d场景的文件和对象,然后得到跟踪的结果 这些阴影在数学上必须是正确的 没有数学上正确或错误的照明。你的意思在物理上是正确的 要创建的图像依赖于光传播。正确模拟光传播的唯

我想模拟复杂和复合透明对象投射的阴影。 对于特定光源(至少对于点光源),此阴影必须在数学上正确。我认为这对任何图形库都是正确的,是吗? 然后,绝对不能有任何折射


当然,这张照片不是我真正想要的

OpenGL能做到这一点吗?如果不能,我应该用什么来代替呢

UPD.所以我需要一些路径跟踪器。是否有一些我可以用编程的方法:给它一个3d场景的文件和对象,然后得到跟踪的结果

这些阴影在数学上必须是正确的

没有数学上正确或错误的照明。你的意思在物理上是正确的

要创建的图像依赖于光传播。正确模拟光传播的唯一方法是将虚拟光子发射到场景中并沿其路径移动。这称为路径跟踪

OpenGL能做到这一点吗

OpenGL只绘制点、线和三角形…一次一个,没有任何场景或模型的概念

旧的固定功能管道OpenGL内置了一个简单的Blinn照明模型,但这只是基于曲面方向(法线)和相对于光源的位置计算每个顶点的“灯光”值

现代OpenGL甚至没有做到这一点。取而代之的是,它依靠程序员提供程序,这些程序针对每个顶点执行,以确定它在图片中的位置,并针对绘制的每个片段(大约一个像素)确定给它什么颜色

在这个叫做着色器的程序中,你可以做任何事情。因此,如果您想使用OpenGL着色器实现路径跟踪器,您当然可以这样做。但此路径跟踪器不会与您绘制的点、线和三角形交互。相反,这些仅用于定义着色器进行计算的边界

如果不能,我应该用什么来代替呢


这不是一个是否可能的问题,而是实现起来有多容易。在您的情况下,OpenGL肯定不是正确的编程环境,因为您基本上是从零开始的。相反,您应该在周围使用一个现有的路径跟踪器。还有一些是GPU加速的。

定义“数学上正确”。哦,好问题,谢谢。与对象相交的源的任何直线都必须以某个平面上的阴影结束。阴影的色调取决于与此线相交的对象材质的厚度和透明度。如果有一些空洞,它们必须被考虑。简短的回答:不,OpenGL是一个光栅化器,你正在寻找一个光线跟踪器。一个较长的答案可能包含一些关于如何在OpenGL中实现的推测,但由于您似乎对OpenGL或计算机图形不太了解(无意冒犯),我认为这对您没有帮助。我的建议:看看Blender。大多数3D游戏都不适合这种真实感(至少不适合动态对象);对于这样一个微妙的效果来说,它的计算代价实在太高了。@AndreasHaferburg,谢谢。是的,路径跟踪器是我真正需要的。您能推荐一些可以跟踪给定场景并可编程使用的场景吗(请参见UPD)?感谢您的详细解释!所以我需要一个场景的路径跟踪器。你能推荐一些可以编程使用的wich(post中的UPD)吗?@AlexanderTrofimchouk:如果你用谷歌搜索“开源路径跟踪器”,你会得到很多结果。就我个人而言,我很喜欢这本书。与几乎所有独立渲染器一样,LuxRender将接收场景描述文件并发射图像。以编程方式生成场景描述文件、生成渲染器进程并读回结果是完全合法的。事实上,从健壮性和模块化的角度来看,将任务分离为单独的流程是非常可取的。库提供的许多东西通常更适合单独的可执行文件。