HLSL 如何正确勾勒出平面阴影模型
HLSL How to properly outline a flat-shaded model
我有一个问题,希望你能帮助我。我一直忙于用 xna 制作游戏,最近开始接触着色器 (hlsl)。我喜欢、使用并希望改进这个着色器。
着色器通过绘制模型的背面(黑色)并沿其法线平移顶点来创建轮廓。现在,对于平滑阴影模型,这很好。但是,我使用的是平面阴影模型(我是通过手机发布的,但如果有人对这意味着什么感到困惑,我可以稍后上传图片)。这意味着顶点沿其相应面的法线平移,从而导致面之间出现可见的间隙。
现在,问题是:有没有一种方法可以计算(在着色器或 xna 中),我应该如何平移每个顶点,或者是唯一可行的选择只是制作 3d 模型的副本,但是有平滑的阴影?
在此先感谢,希望您不吝赐教!
编辑:或者,我可以只加载平滑着色模型,并尝试在着色器中对其进行平面着色。然而,这意味着我必须能够找到相应面的所有顶点的法线,添加它们的法线,并对结果进行归一化。有没有办法做到这一点?
EDIT2:到目前为止,我发现了一些似乎最终不起作用的选项:现在不推荐在 hlsl 中设置 "shademode"。将 fillmode 设置为 "wireframe" 会很好(同时剔除正面),如果我能够设置线条粗细的话。
我正在研究一个新想法。我也许可以遍历顶点,找到它们在屏幕上的位置,然后使用类似 RoundLine 库的东西在这些点之间绘制二维线。我要试试这个,看看它是否有效。
好的,我已经研究这个问题一段时间了,发现了一些非常有效的方法。
我没有做很多复杂的数学运算来在正确的深度绘制二维线,而是简单地做了以下事情:
设置剔除正面、绘制线框并具有轻微负深度偏差的光栅化器状态。
现在用全黑绘制模型(我为此修改了我的着色器)
设置剔除背面的光栅化器状态,在 fillmode.solid 中绘制并具有 0 深度偏差。
现在正常画模型。
由于我们无法更改线框线的粗细,因此我们只剩下一个非常细的轮廓。就我的目的而言,这实际上还算不错。
我希望这些信息对以后的人有用。
我有一个问题,希望你能帮助我。我一直忙于用 xna 制作游戏,最近开始接触着色器 (hlsl)。我喜欢、使用并希望改进这个着色器。
着色器通过绘制模型的背面(黑色)并沿其法线平移顶点来创建轮廓。现在,对于平滑阴影模型,这很好。但是,我使用的是平面阴影模型(我是通过手机发布的,但如果有人对这意味着什么感到困惑,我可以稍后上传图片)。这意味着顶点沿其相应面的法线平移,从而导致面之间出现可见的间隙。
现在,问题是:有没有一种方法可以计算(在着色器或 xna 中),我应该如何平移每个顶点,或者是唯一可行的选择只是制作 3d 模型的副本,但是有平滑的阴影?
在此先感谢,希望您不吝赐教!
编辑:或者,我可以只加载平滑着色模型,并尝试在着色器中对其进行平面着色。然而,这意味着我必须能够找到相应面的所有顶点的法线,添加它们的法线,并对结果进行归一化。有没有办法做到这一点?
EDIT2:到目前为止,我发现了一些似乎最终不起作用的选项:现在不推荐在 hlsl 中设置 "shademode"。将 fillmode 设置为 "wireframe" 会很好(同时剔除正面),如果我能够设置线条粗细的话。
我正在研究一个新想法。我也许可以遍历顶点,找到它们在屏幕上的位置,然后使用类似 RoundLine 库的东西在这些点之间绘制二维线。我要试试这个,看看它是否有效。
好的,我已经研究这个问题一段时间了,发现了一些非常有效的方法。
我没有做很多复杂的数学运算来在正确的深度绘制二维线,而是简单地做了以下事情: 设置剔除正面、绘制线框并具有轻微负深度偏差的光栅化器状态。 现在用全黑绘制模型(我为此修改了我的着色器) 设置剔除背面的光栅化器状态,在 fillmode.solid 中绘制并具有 0 深度偏差。 现在正常画模型。
由于我们无法更改线框线的粗细,因此我们只剩下一个非常细的轮廓。就我的目的而言,这实际上还算不错。
我希望这些信息对以后的人有用。