Xna 360 FOV深度缓冲区(按拓扑和具有多个灯光的2D阴影)

Xna 360 FOV深度缓冲区(按拓扑和具有多个灯光的2D阴影),xna,directx,monogame,2d-games,Xna,Directx,Monogame,2d Games,刚刚用多个灯光实现了idea(这里是没有多个灯光的idea),但是我不确定它是否正确渲染,我只是用GraphicsDevice.BlendState=BlendState.Additional将每个场景渲染到屏幕上;关于灯光,所以场景只是相互添加 还有一个问题——它看起来对不对?回答这个问题。对不起,没有,但是我已经被腐蚀了,让我解释一下 人眼是对数的。为了感知到比我们的眼睛明亮两倍的东西,我们需要调整进入眼睛的光线的大小。声音也是如此 但屏幕的RGB值是线性的RGB 128128的亮度是64,

刚刚用多个灯光实现了idea(这里是没有多个灯光的idea),但是我不确定它是否正确渲染,我只是用GraphicsDevice.BlendState=BlendState.Additional将每个场景渲染到屏幕上;关于灯光,所以场景只是相互添加


还有一个问题——它看起来对不对?

回答这个问题。对不起,没有,但是我已经被腐蚀了,让我解释一下

人眼是对数的。为了感知到比我们的眼睛明亮两倍的东西,我们需要调整进入眼睛的光线的大小。声音也是如此

但屏幕的RGB值是线性的RGB 128128的亮度是64,64,64的两倍。它必须是线性的,否则我们的着色算法将无法工作。美国的衰落太快了

不,我们的计算是错误的,但是制造我们屏幕的人知道这一点,并尽可能地纠正它

而不是我解释看这个

因此,要获得正确的混合,您需要在两个渲染之间创建正确的混合。没有混合状态来解决此问题,因此您必须创建一个自定义像素着色器来完成此工作。output.color=sqrt(功率(input1.color,2)+功率(input2.color,2))

这是非常微妙的,但改变两个光源的颜色,然后在线性和对数混合之间切换,你会想知道你是如何忍受破坏的渲染输出的

我做所有渲染和照明计算,如光子计数、平方输入颜色和平方根输出颜色


阿尔法呢?是的?我不确定。

谢谢你的解释!实际上,我可以在像素着色器中实现这一点,但是它很好,你看不到像“边缘阴影”(在现实世界中,它们应该消失,当光子通过障碍物的边缘时,它们应该随机转向阴影方向),或者光功率线性计算,但是应该用距离的平方根来计算。正在思考如何解决第一个问题,但始终不知道:(也许模具缓冲区能帮上忙……我又看了一次YouTube演示。我没有访问最快的互联网,所以第一次观看时的分辨率很低。我又看了一次高分辨率的演示。你似乎有什么奇怪的事情发生,我不太清楚。对于模糊,阴影贴图的一个骗局是用灯光模糊阴影的边缘事实上,光线越低,模糊就越多。这并不完美,但也不过分。它会使边缘变得更好。事实上,在像素求和的后处理中,没有模糊,但像素着色器中有一个技巧-我知道像素位置和灯光位置之间的角度是atan2,但也知道直线的第一个和第二个垂直角度h放置阴影,所以我只需检查像素是否在0.1度的模糊范围内,并通过表达式minAngle计算颜色。好吧,我已经解决了大多数问题:)必须渲染到深度和模糊缓冲区两次(使用不同的混合,通过掩蔽通道),所以现在VS缓冲区的这些行渲染4(!)当然,我可以用一个VS过程渲染到不同的渲染目标,但是在PS(我渲染阴影贴图)中,我可以访问两种不同的纹理。VS中有很多逻辑,但PS尽可能简单。下面是未优化的.fx