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 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿