有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何为雪碧的特定部分着色

我一直在为我计划制作的一款战略游戏开发一个等距的minecraft风格的游戏引擎。正如你所见,它确实需要一些照明。很难区分不同的海拔,因为所有的东西都是相同的阴影。所以我的问题是:我能给雪碧的特定部分着色吗?所有这些块都只是精灵,所以如果我对整个图像进行着色,它会对整个块进行着色

ScreenShot from engine


共 (1) 个答案

  1. # 1 楼答案

    这取决于你如何照明

    基本上,精灵只是由两个三角形组成的有纹理的四边形

    传统的基于顶点的照明(由内置功能支持,但现在已弃用)将只计算该四边形的4个角的照明,其他所有内容都将进行插值。这相当快,但可能会导致错误的照明-尤其是聚光灯和大四边形

    如果只使用定向照明,可能会对四边形应用法线贴图,从而以逐纹理的方式影响照明,但这可能仍然不是您想要的

    现代的方法是使用着色器,即照明是按像素计算的。然后必须为四边形提供逐纹理照明信息,然后在片段/像素着色器中使用

    为了澄清一下,本文中一些术语的含义:

    • 每texel:纹理中的每像素,这些值可能会被插值
    • 每像素:每输出像素,即每屏幕像素

    编辑

    我刚刚看了你的截图,如果相邻的精灵不在同一水平面上,你似乎必须改变精灵边缘的阴影。假设您已经知道哪个精灵边应该是可见的(即,在该边上有一个级别更改),您可以只更改形成该边的顶点的着色

    如果不使用任何照明,可以开始将顶点颜色设置为白色,并为需要着色的顶点设置较暗的颜色。然后将纹理颜色与顶点颜色相乘,这将产生较暗的边缘

    或者,如果这些级别具有不同的深度(即不同的z值),则可以使用一些着色器进行边缘检测(例如,一些SSAO实现)

    编辑2:

    如果使用普通的旧顶点照明,应用加权法线可能会有所帮助。基本上,可以从共享一个顶点的三角形的法线计算加权顶点法线

    有几种方法可以做到这一点,其中一种是根据顶点的角度对面进行加权。可以将法线乘以这些角度,然后相加,最后对得到的法线进行规格化

    计算的结果可能是这样的(ASCII艺术):

    |       |         /
    |_______|________/             
                     | /     |       |
                     |/______|_______| 
    

    向上的线是法线,底线是侧视图中的精灵