apunka 2018-01-22 01:47 采纳率: 62.5%
浏览 1771
已采纳

unity ComputeShader里结构体变量初始化如何不用分支判断

unity ComputeShader里结构体变量初始化如何不用分支判断

init 是一个int 类型 在跑完第一帧之后会被设置成其他值
现在想求助各位大神
如何在不使用标志位的情况下初始化这个结构体里的成员变量
dataBuffer[f].pos = pos;
dataBuffer[f].velocity = float3(0, 0, 0);
(补充说明:如果没有这个if分支初始化变量会导致不显示,直接初始化没有标志位分支表现结果和预期不符)

 // Each #kernel tells which function to compile; you can have many kernels
#pragma kernel CSMain

// Create a RenderTexture with enableRandomWrite flag and set it
// with cs.SetTexture
RWTexture2D<float4> Result;
float3 mousePos;
float3 originPos;
float deltaTime;
int init;
float radius;
struct Data
{
    float3 pos;
    float3 velocity;
    float3 uv;
};
RWStructuredBuffer<Data> dataBuffer;

//[numthreads(32, 32, 1)]

[numthreads(32, 32, 1)]
void CSMain(uint3 id : SV_DispatchThreadID)
{
    // TODO: insert actual code here!

    //id.x 第X列的线程ID
    //id.y 第Y行的线程ID

    uint f = id.x + id.y * 32 * 64;
    //   uint f = id.x + id.y * 32 * 64;
    float3 pos = float3(id.x, id.y, id.z) / 2 + originPos; //计算出原始坐标
    dataBuffer[f].uv = ((pos - originPos) / 2048) * 2; //计算出每个点的uv
    //dataBuffer[f].uv = ((pos - originPos) / 2048) * 2; //计算出每个点的uv

    if (init == 0)//初始化点
    {
        dataBuffer[f].pos = pos;
        dataBuffer[f].velocity = float3(0, 0, 0);
    }else
    {

        float3 dis = dataBuffer[f].pos - mousePos; //计算出当前坐标与鼠标点间的向量

        float vel = clamp(radius - length(dis), 0.01, radius) * deltaTime * 20; //计算出力

        dataBuffer[f].velocity += normalize(dis) * vel; //加上力

        dataBuffer[f].velocity = normalize(dataBuffer[f].velocity) * clamp((length(dataBuffer[f].velocity) - deltaTime * 2), 0, radius); //限制力的范围,并且加上指向原始点的力

        dataBuffer[f].pos = pos + dataBuffer[f].velocity; //根据力计算出坐标
    }


}

  • 写回答

1条回答 默认 最新

  • helloahuan 2018-01-22 08:39
    关注

    if else 最容易用非分支来计算了

    简化一下你的计算

    if (init == 0)//初始化点
    {
    dataBuffer[f].pos = pos;

    else

    dataBuffer[f].pos = pos + dataBuffer[f].velocity; //根据力计算出坐标

    可以直接对应为:

    dataBuffer[f].pos = pos + clamp(0,1, floor(abs(init)) ) * dataBuffer[f].velocity;

    讲init取绝对值,再取整,再规到0-1之间,也就是,init != 0的结果全是1,跟后边的计算相乘。。。

    求分,求C币

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题
  • ¥15 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图2.0 版本点聚合中Marker的位置无法实时更新,如何解决呢?
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题