着色器中的 GPU 高度图雕刻

GPU Heightmap sculpting in shader

我已经在 CPU、

上成功完成了雕刻实施

请提供一些有关如何在 GPU 上执行此操作的指南……

我已将雕刻代码移至顶点着色器,但雕刻未在顶点着色器中累积并且无法修改顶点着色器中的位置……请告诉我如何……

if (SculptMode.x == 1)//Raise
{ 
    float dist = length(int2(PickedPoint.xz) - input.position.xz);
    if (dist <= BrushRadius.x)
    {
        PositionOffset += (BrushRadius.y * (cos(PI * dist / float(BrushRadius.x)) + 1.0f) * 0.5f) * DeltaTime.x * 10.0f; 
        input.position.y = PositionOffset; 
    }
}

我正在为它使用 RWTexture2D ...

    if (SculptMode.x == 1)//Raise
    { 
        float dist = length(uint2(PickedPoint.xz) - input.position.xz);
        if (dist <= BrushRadius.x)
        { 
            PositionOffset[int2(input.position.xz)] += BrushRadius.y * smoothstep(0, BrushRadius.x, BrushRadius.x - dist) * DeltaTime.x * 10.0f;
        }
    }

但我的雕刻仍然处于尖峰状...

然后

input.position.y = PositionOffset[int2(input.position.xz)];

虽然我不能肯定地说,但看起来您的问题可能是您没有达到某些像素。如果你展示整个着色器以及你在哪里发送它,我也许可以确认。您在纹理中索引点的方式可能是整个问题。

我认为可能出现的另一个问题是您正在从相同的数据结构(输入)读取和写入 - 虽然您只从 x 和 z 读取,并且只写入 y,但这仍然会造成麻烦,因为xyz 仍然是单个元素的一部分,它会同时设置。

将实现更改为完全不同的方法,这不会起作用,因为我认为这种量化正在发生,因为三角形之间共享顶点并且雕刻调整多次应用于同一顶点,这就是尖峰的原因......