ue4-4,transform 凹凸 视差 置换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ue4-4,transform 凹凸 视差 置换相关的知识,希望对你有一定的参考价值。

参考技术A 本身法线是切线空间的,将它转化成世界空间,就可以利用法线的信息,增加细节。

法线贴图上每个像素都代表着这个点在切线空间的朝向。切线空间的xyz轴不是固定的,以像素垂直方向为z,uv上的u为x,v方向为y。

一个法线点的信息,主要包括在x和y方向。大体上因为像素本身垂直方向就是z轴本身,所以体现在法线贴图上,z轴信息基本不会有很大变化,所以我们可以看到法线贴图,基本都是以蓝色为基,再增加红色和绿色代表xy的信息。

正常来说,法线信息只能用于法线贴图,通过transform节点,可以将其转化为世界朝向信息,毕竟,法线本身最主要的还是朝向问题。

需要注意的是,顶点向量,像素向量,和由transform转化来的向量,他们的范围都是-1到1

maskvector分离出来的也是-1到1。

0.05是高度偏移值,越大突出的效果越强。

最小步长/最大步长,控制着偏移的过度效果,值给的越高,过度效果越好。

heightmap channel的输入值,是对纹理对象的哪个通道进行取值。

使用置换效果,需要在主材质节点打开曲面细分。

需要注意的是,虽然使用置换材质,当物体落在置换材质表面,依然会使用未置换前的坐标信息。

再来看下细分级别

pn三角形适合人物模型特写时使用,它具有平滑作用。

Unity Shader Graph中的Worldspace 2d纹理置换

【中文标题】Unity Shader Graph中的Worldspace 2d纹理置换【英文标题】:Worldspace 2d texture displacemet in Unity Shader Graph 【发布时间】:2020-06-29 16:31:00 【问题描述】:

我正在开发一款 2D 自上而下的游戏。我有一个在单个大纹理上移动并在其上投射阴影的对象(只是一个模糊的深色精灵)。然而我发现,由于我的纹理有凹凸、岩石、折痕等,看起来影子精灵只是在地面上方盘旋。 所以我想我可以使用我的纹理作为置换贴图来根据纹理的表面扭曲阴影精灵。我正在尝试在 Shader Graph 中实现它,但我无法获得底层纹理的正确位置和比例来投射阴影。 我尝试实现一个简化版本的着色器,它精确地再现了它悬停在上方的Ground Texture 部分。

在这种情况下,缩放似乎已关闭,生成的纹理比原始纹理小很多。我不确定这个位置,但它似乎也关闭了。我错过了什么吗?还是有更简单的方法来实现这一点?

提前致谢。

【问题讨论】:

【参考方案1】:

我不确定这是否是最优雅的解决方案,但我找到了。

我应该使用Tiling and Offset 节点来缩放和移动地面纹理的UV。这是着色器图:

现在,这个着色器使对象将其放置在其上的地面纹理部分投影到自身上。它似乎与纹理完美对齐。

地面位置在代码中计算:

[RequireComponent(typeof(SpriteRenderer))]
public class displaced_shadow : MonoBehaviour

    SpriteRenderer sr;
    Rect rect;
    MaterialPropertyBlock material_properties;
    float pixels_per_unit;

    public Vector2 Size //get size of the texture in Unity units
    
        get  return new Vector2(rect.width * transform.localScale.x/ pixels_per_unit, rect.height * transform.localScale.y/ pixels_per_unit);  
    

    private void Awake()
    
        sr = GetComponent<SpriteRenderer>();
        rect = sr.sprite.rect;
        pixels_per_unit = sr.sprite.pixelsPerUnit;
        material_properties = new MaterialPropertyBlock();
    

    // Update is called once per frame
    void Update()
    
        Vector2 relative_position = CalculateRelativePostion();
        FeedMaterial(relative_position);
    

    private Vector2 CalculateRelativePostion() //calculate the position relative to the background in [0,1] range
    
        if (background_floor.This == null) return Vector3.zero;

        Vector2 bg_position = background_floor.This.Position; //get the size and position of the background texture
        Vector2 bg_size = background_floor.This.Size;

        float origin_x1 = transform.position.x - Size.x/2f; //calculate the top left corner positions in case textures have their origins in the center
        float origin_y1 = transform.position.y - Size.y / 2f;
        float origin_x2 = bg_position.x - bg_size.x / 2f;
        float origin_y2 = bg_position.y - bg_size.y / 2f;

        float x = (origin_x1 - origin_x2) / bg_size.x; //get the [0,1] position of the object relative to the ground texture
        float y = (origin_y1 - origin_y2) / bg_size.y;

        return new Vector2(x, y);
    

    private void FeedMaterial(Vector2 relative_position)
    
        sr.GetPropertyBlock(material_properties);
        material_properties.SetVector("_GroundPosition", relative_position);
        sr.SetPropertyBlock(material_properties);
    

【讨论】:

以上是关于ue4-4,transform 凹凸 视差 置换的主要内容,如果未能解决你的问题,请参考以下文章

Blender程序化地形制作

Blender程序化地形制作

[2D凹凸映射-Monogame

Unity Shader Graph中的Worldspace 2d纹理置换

R语言coin包应用于独立性问题的置换检验(permutation tests)同一数据集使用独立样本t检验与置换检验oneway_test函数单向精确检验结论不同时置换法更可信收集数据继续测试

视差滚动部分不固定/100% 高度?