【问题标题】:HLSL How to properly outline a flat-shaded modelHLSL 如何正确勾勒平面阴影模型
【发布时间】:2015-01-08 16:49:22
【问题描述】:

我有一个问题,希望你能帮助我。我一直忙于用 xna 制作游戏,最近开始涉足着色器 (hlsl)。我喜欢、使用并希望改进这个着色器。

着色器通过绘制模型的背面(黑色)并沿其法线平移顶点来创建轮廓。现在,对于平滑阴影模型,这很好。但是,我使用的是平面阴影模型(我是通过手机发布的,但如果有人对这意味着什么感到困惑,我可以稍后上传图片)。这意味着顶点沿其对应面的法线平移,从而导致面之间出现可见间隙。

现在,问题是:有没有办法计算(在着色器或 xna 中),我应该如何翻译每个顶点,或者是唯一可行的选择只是制作 3d 模型的副本,但平滑阴影?

先谢谢了,希望大家多多指教!

编辑:或者,我可以只加载一个平滑着色模型,并尝试在着色器中对其进行平面着色。然而,这意味着我必须能够找到相应面的所有顶点的法线,添加它们的法线,并对结果进行归一化。有没有办法做到这一点?

EDIT2:到目前为止,我发现了一些最终似乎不起作用的选项:现在不推荐在 hlsl 中设置“shademode”。将填充模式设置为“线框”会很整洁(同时剔除正面),只要我能够设置线条粗细。

我正在这里研究一个新想法。我也许可以遍历顶点,找到它们在屏幕上的位置,并使用 RoundLine 库之类的东西在这些点之间绘制二维线。我要试试这个,看看它是否有效。

【问题讨论】:

    标签: xna shader hlsl vertex outline


    【解决方案1】:

    好的,我已经解决这个问题一段时间了,发现了一些效果很好的东西。

    我做了很多复杂的数学运算来在正确的深度绘制二维线,我只是做了以下事情: 设置一个光栅化状态,剔除正面,绘制线框,并具有略微负的深度偏差。 现在用全黑绘制模型(为此我修改了我的着色器) 设置一个光栅化状态,剔除背面,在 fillmode.solid 中绘制并具有 0 深度偏差。 现在正常绘制模型。

    由于我们无法更改线框线条的粗细,我们只剩下一个非常纤细的轮廓。就我而言,这实际上并不算太糟糕。

    我希望这些信息对以后的人有用。

    【讨论】:

      猜你喜欢
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-12
      • 2020-09-25
      • 1970-01-01
      相关资源
      最近更新 更多