gpt4 book ai didi

unity3d - Unity Shader Graph 中的世界空间二维纹理置换

转载 作者:行者123 更新时间:2023-12-04 15:24:13 24 4
gpt4 key购买 nike

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

enter image description here

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

提前致谢。

最佳答案

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

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

enter image description here

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

地面位置在代码中计算:

[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);
}
}

关于unity3d - Unity Shader Graph 中的世界空间二维纹理置换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62642625/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com