Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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_Direct3d - Fatal编程技术网

Opengl 如何在具有程序纹理的场景中反射镀铬球体

Opengl 如何在具有程序纹理的场景中反射镀铬球体,opengl,direct3d,Opengl,Direct3d,我的场景背景是一种程序纹理,用于绘制海洋、熔岩层或其他类似背景。它也完全在下面延伸,就像你在一个立方体地图里面一样。如果我可以假设所有方向的视图都是相同的,那就更容易了,但是如果有太阳,比如说,你就不能 现在如果我想把铬球放在中间,它反映了什么?球体看到的东西和主摄影机看到的一样吗 假设渲染背景很昂贵,我不想每帧渲染多次。如果有帮助的话,我可以保存一份副本用于反射 有人能提出一个通用的方法吗?这是一个程序纹理的示例,我的意思是(这都在着色器中,除了四边形之外没有其他几何体): 回答第一个问题:在

我的场景背景是一种程序纹理,用于绘制海洋、熔岩层或其他类似背景。它也完全在下面延伸,就像你在一个立方体地图里面一样。如果我可以假设所有方向的视图都是相同的,那就更容易了,但是如果有太阳,比如说,你就不能

现在如果我想把铬球放在中间,它反映了什么?球体看到的东西和主摄影机看到的一样吗

假设渲染背景很昂贵,我不想每帧渲染多次。如果有帮助的话,我可以保存一份副本用于反射

有人能提出一个通用的方法吗?这是一个程序纹理的示例,我的意思是(这都在着色器中,除了四边形之外没有其他几何体):


回答第一个问题:在现实世界中,您在球体中看到的反射既取决于相机的位置,也取决于球体本身的位置。但是,在使用立方体贴图(最常用的方法)时,对于移动的球体来说,将两个位置都考虑在内的代价太高,因为必须在每个帧中重新渲染立方体贴图的所有六个面。因此,大多数游戏通过使用以原点(世界空间中的(0,0,0)为中心的立方体贴图“伪造”现实,并仅将静态对象(树等)渲染到立方体贴图中

由于背景完全是程序性的,因此可以跳过创建立方体贴图纹理。如果可以将程序背景纹理定义为原点方向(而不是位置!)的函数,则可以使用球体上每个点的法向量,加上球体的位置,再加上相机位置,从背景纹理中进行采样

下面是公式,使用一些glsl伪代码:

vec3 N = normal vector for point on sphere
vec3 V = position of camera
vec3 S = position of point on sphere

vec3 ray = normalize(reflect(V-S,N));
// Reflect the vector pointing from the a point on the sphere to 
// the camera over the normal vector for the sphere.

vec4 color = proceduralBackgroundFunc(ray);
上面,
color
是球体曲面上点
S
的着色器的最终输出

或者,您可以将背景预渲染为立方体纹理,然后像这样从中采样(仅更改上面的最后一行代码):

我认为你所追求的是(除了你应该使用你的程序纹理,而不是从文件加载的图像)。
vec4 color = texture(cubeSample,ray);