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

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币

    已采纳该答案
    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题