예제 #1
0
    private void UpdateShaderParameters(RenderTexture t, ComputeBuffer myLock)
    {
        uint zf, zw;

        if (t == null)
        {
            t = _outputRT;
        }

        _kernelsLoaded = _shader.HasKernel("WriteDepth") && _shader.HasKernel("Clear");
        if (!_kernelsLoaded)
        {
            Debug.LogError("Shader Kernel compilation error");
            return;
        }

        _materialToShareTexture.SetTexture(_textureName, t);
        _clearKernel      = _shader.FindKernel("Clear");
        _writeDepthKernel = _shader.FindKernel("WriteDepth");

        //_shader.SetBuffer(_clearKernel, "Depth", d);
        _shader.SetTexture(_clearKernel, "Result", t);
        _shader.SetBuffer(_clearKernel, "lock", myLock);

        //_shader.SetBuffer(_writeDepthKernel, "Depth", d);
        _shader.SetBuffer(_writeDepthKernel, "lock", myLock);
        _shader.SetTexture(_writeDepthKernel, "Result", t);
        _shader.SetTexture(_writeDepthKernel, "DepthTexture", depth);
        _shader.SetTexture(_writeDepthKernel, "AlbedoTexture", albedo);



        _shader.GetKernelThreadGroupSizes(_clearKernel, out _xf, out _yf, out zf);
        _shader.GetKernelThreadGroupSizes(_writeDepthKernel, out _xw, out _yw, out zw);
    }
    private void UpdateShaderParameters(RenderTexture t, ComputeBuffer d, List <ComputeBuffer> d0, ComputeBuffer m)
    {
        uint zf, zd, zw;

        if (t == null)
        {
            t = _outputRT;
        }

        _kernelsLoaded = _shader.HasKernel("WriteDepth") && _shader.HasKernel("DisplaceAlbedo") && _shader.HasKernel("Clear");
        if (!_kernelsLoaded)
        {
            Debug.LogError("Shader Kernel compilation error");
            return;
        }

        _materialToShareTexture.SetTexture(_textureName, t);
        _clearKernel      = _shader.FindKernel("Clear");
        _writeDepthKernel = _shader.FindKernel("WriteDepth");
        _displaceKernel   = _shader.FindKernel("DisplaceAlbedo");

        _shader.SetBuffer(_clearKernel, "Depth", d);
        _shader.SetBuffer(_clearKernel, "Depth0[0]", d0[0]);
        _shader.SetBuffer(_clearKernel, "Depth0[1]", d0[1]);
        _shader.SetBuffer(_clearKernel, "Depth0[2]", d0[2]);
        _shader.SetBuffer(_clearKernel, "Depth0[3]", d0[3]);
        _shader.SetBuffer(_clearKernel, "MutexBuffer", m);
        _shader.SetTexture(_clearKernel, "Result", t);

        _shader.SetBuffer(_writeDepthKernel, "Depth", d);
        _shader.SetBuffer(_writeDepthKernel, "Depth0[0]", d0[0]);
        _shader.SetBuffer(_writeDepthKernel, "Depth0[1]", d0[1]);
        _shader.SetBuffer(_writeDepthKernel, "Depth0[2]", d0[2]);
        _shader.SetBuffer(_writeDepthKernel, "Depth0[3]", d0[3]);
        _shader.SetBuffer(_writeDepthKernel, "MutexBuffer", m);
        _shader.SetTexture(_writeDepthKernel, "Result", t);
        _shader.SetTexture(_writeDepthKernel, "DepthTexture", depth);
        _shader.SetTexture(_writeDepthKernel, "AlbedoTexture", albedo);

        _shader.SetBuffer(_displaceKernel, "Depth", d);
        _shader.SetBuffer(_displaceKernel, "Depth0[0]", d0[0]);
        _shader.SetBuffer(_displaceKernel, "Depth0[1]", d0[1]);
        _shader.SetBuffer(_displaceKernel, "Depth0[2]", d0[2]);
        _shader.SetBuffer(_displaceKernel, "Depth0[3]", d0[3]);
        _shader.SetBuffer(_displaceKernel, "MutexBuffer", m);
        _shader.SetTexture(_displaceKernel, "Result", t);
        _shader.SetTexture(_displaceKernel, "DepthTexture", depth);
        _shader.SetTexture(_displaceKernel, "AlbedoTexture", albedo);

        _shader.GetKernelThreadGroupSizes(_clearKernel, out _xf, out _yf, out zf);
        _shader.GetKernelThreadGroupSizes(_writeDepthKernel, out _xw, out _yw, out zw);
        _shader.GetKernelThreadGroupSizes(_displaceKernel, out _xd, out _yd, out zd);
    }
        public CustomComputeKernel(ComputeShader cs, string kn)
        {
            string kernelNameWithChannelsOrder = kn + (ComputeInfo.channelsOrder == ComputeInfo.ChannelsOrder.NHWC ? "_NHWC" : "_NCHW");

            if (!cs.HasKernel(kernelNameWithChannelsOrder) && !cs.HasKernel(kn))
            {
                throw new ArgumentException($"Kernel {kn} and {kernelNameWithChannelsOrder} are both missing");
            }

            shader      = cs;
            kernelName  = cs.HasKernel(kernelNameWithChannelsOrder)?kernelNameWithChannelsOrder:kn;
            kernelIndex = shader.FindKernel(kernelName);
            shader.GetKernelThreadGroupSizes(kernelIndex, out threadGroupSizeX, out threadGroupSizeY, out threadGroupSizeZ);
        }
예제 #4
0
        public ComputeKernel(ComputeShader shader, string name)
        {
            if (!shader.HasKernel(name))
            {
                throw new ArgumentException("The shader doesn't contain a kernel with this name.", nameof(name));
            }

            Id     = shader.FindKernel(name);
            Shader = shader;
        }
    static bool TryGetKernel(string kernelName, ref ComputeShader cs, ref int kernelID)
    {
        if (!cs.HasKernel(kernelName))
        {
            Debug.LogError(kernelName + " kernel not found in " + cs.name + "!");
            return(false);
        }

        kernelID = cs.FindKernel(kernelName);
        return(true);
    }
예제 #6
0
    /// <summary>
    /// ComputeShaderを介してシミュレート
    /// </summary>
    void Simulation()
    {
        ComputeShader cs       = particleCS;
        int           kernelID = -1;

        int threadGroupSize = Mathf.CeilToInt(maxObjectNum / SIMULATION_BLOCK_SIZE);

        if (cs.HasKernel("MainCS"))
        {
            kernelID = cs.FindKernel("MainCS");
            cs.SetFloat("_Time", Time.time);
            cs.SetBuffer(kernelID, "_ParticleDataBufferR", _particleBuf);
            cs.SetBuffer(kernelID, "_ParticleDataBuffer", _particleBuf);

            cs.Dispatch(kernelID, threadGroupSize, 1, 1);
        }
    }
예제 #7
0
    private void Initialize()
    {
        if (shader == null)
        {
            Debug.LogError("Shader is null");
        }
        if (!shader.HasKernel(kernalName))
        {
            Debug.LogError("No Kernel in this shader", shader);
        }
        kernalIndex = shader.FindKernel(kernalName);

        foreach (ComputeBase computeBase in computeBases)
        {
            computeBase.Initialize(shader, kernalIndex);
        }
    }
    private void PrepareShaderForRendering()
    {
        Debug.Assert(shaderForRayCasting != null);
        Debug.Assert(shaderForRayCasting.HasKernel(SHADER_KERNEL_NAME));

        // Find the main functiona that will be used for dispatch and setting the data.
        kernelIndexOfMain = shaderForRayCasting.FindKernel(SHADER_KERNEL_NAME);

        // Returns the thread group sizes from compute shader code "[numthreads(32, 32, 1)]".
        shaderForRayCasting.GetKernelThreadGroupSizes(kernelIndexOfMain,
                                                      out threadsPerThreadGroup.x,
                                                      out threadsPerThreadGroup.y,
                                                      out threadsPerThreadGroup.z);

        Debug.Assert(
            threadsPerThreadGroup.x == THREAD_PER_GROUP &&
            threadsPerThreadGroup.y == THREAD_PER_GROUP &&
            threadsPerThreadGroup.z == 1, "Incorrect thread group values");
    }
    public static int HasKernel(IntPtr l)
    {
        int result;

        try
        {
            ComputeShader computeShader = (ComputeShader)LuaObject.checkSelf(l);
            string        name;
            LuaObject.checkType(l, 2, out name);
            bool b = computeShader.HasKernel(name);
            LuaObject.pushValue(l, true);
            LuaObject.pushValue(l, b);
            result = 2;
        }
        catch (Exception e)
        {
            result = LuaObject.error(l, e);
        }
        return(result);
    }
예제 #10
0
    public override void Render(ScriptableRenderContext context, Camera[] cameras)
    {
        base.Render(context, cameras);

        var cmd = new CommandBuffer();

        cmd.ClearRenderTarget(true, true, Color.yellow);

        if (_shader != null && _shader.HasKernel(KernelName))
        {
            int index  = _shader.FindKernel("CSMain");
            var target = new RenderTargetIdentifier(BuiltinRenderTextureType.CurrentActive);
            cmd.SetComputeTextureParam(_shader, index, "Result", target);
            cmd.DispatchCompute(_shader, index, _width, _height, 1);
        }

        context.ExecuteCommandBuffer(cmd);

        context.Submit();
    }
예제 #11
0
 public static int FindKernelOrWarn(this ComputeShader compute, string kernalName, ref bool IsReady)
 {
     if (IsReady)
     {
         if (compute.HasKernel(kernalName))
         {
             int kernel = compute.FindKernel(kernalName);
             IsReady = true;
             return(kernel);
         }
         else
         {
             IsReady = false;
             Logging.Warning("{0}: Can't find Compute Shader Kernel of name {1}", EXTNAME, kernalName);
             return(-1);
         }
     }
     else
     {
         Logging.Log("{0}: Not attempting to find Kernel - caller was not ready state!", EXTNAME);
         return(-1);
     }
 }
예제 #12
0
 public static int TryFindKernel(this ComputeShader shader, string name)
 {
     return(shader.HasKernel(name) ? shader.FindKernel(name) : -1);
 }
예제 #13
0
 public static int FindKernel(this ComputeShader comp, string name)
 {
     return(comp.HasKernel(name) ? comp.FindKernel(name) : -1);
 }