• UnityShader 全局传值无效


    1.前言

            Unity shader开发中需要用C#给shader代码传值,我使用全局给shader传值的时候发现并没有起作用,这里记录了容易忽视的问题。

    2.Shader传递参数

            unity中C#向Shader传递参数的方式有以下两种:

            1、面向具体Material的SetFloatXXX系列(这个是实例方法)

            2、面向全部Shader的SetFloatXXX系列(这个是静态方法)

    我这里用的是第二种方法。

    3.问题还原

            1.首先我为了测试,写了一个简单的改变透明度的shader例子,使用透明度_AlphaScale的值来做传递的参数。代码如下:

    1. Shader "PointCloud" {
    2. Properties{
    3. _AlphaScale("Alpha Scale", Range(0, 1)) = 1 //控制整体的透明度
    4. }
    5. SubShader{
    6. Tags {"Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent"}
    7. Pass{
    8. Tags { "LightMode" = "ForwardBase" }
    9. ZWrite Off //关闭深度写入
    10. Blend SrcAlpha OneMinusSrcAlpha //设置混合模式,为普通的方式
    11. LOD 200
    12. CGPROGRAM
    13. #pragma vertex vert
    14. #pragma fragment frag
    15. #include "UnityCG.cginc"
    16. fixed _AlphaScale; //有默认的uniform
    17. struct VertexInput {
    18. float4 v : POSITION;
    19. float4 color: COLOR;
    20. };
    21. struct VertexOutput {
    22. float4 pos : SV_POSITION;
    23. float4 col : COLOR;
    24. };
    25. VertexOutput vert(VertexInput v) {
    26. VertexOutput o;
    27. o.pos = UnityObjectToClipPos(v.v);
    28. o.col = v.color;
    29. return o;
    30. }
    31. float4 frag(VertexOutput o) : COLOR{
    32. return o.col* _AlphaScale;
    33. }
    34. ENDCG
    35. }
    36. }
    37. }

            2.在Unity中创建一个cube,在创建一个新的材质,将这个Shader赋给这个材质,再将这个材质替换cube本身的材质球。

            3.在Unity中创建Slider组件,用Slider组件来控制透明度的值。新建C#脚本,把脚本拖拽到Slider组件上。代码如下:

    1. private Slider slider;
    2. private void Awake()
    3. {
    4. slider = GetComponent();
    5. }
    6. private void Start()
    7. {
    8. slider.onValueChanged.AddListener(SliderClick);
    9. }
    10. private void SliderClick(float value)
    11. {
    12. Shader.SetGlobalFloat("_AlphaScale", value);
    13. }

            4.运行后,拖拽Slider发现cube的透明度并没有发生变化。

    4.解决问题

            首先slider传值到shader是没有问题的,问题在于_AlphaScale在Properties中被定义了,这就需要在材质面板上去修改了,相当于我传递的参数全局修改和材质属性修改冲突了,而Properties结构里参数是由CPU传给GPU的,里面的参数在shader代码是没法修改的。所以办法就是把Properties里的_AlphaScale删除或者注释掉。

    1. Properties{
    2. //_AlphaScale("Alpha Scale", Range(0, 1)) = 1 //控制整体的透明度
    3. }

    这样就能用slider正确的改变透明度了。

  • 相关阅读:
    【SQL数据分析 | 手把手教你做淘宝用户分析!】
    在 Esp32 摄像头上实现边缘脉冲 FOMO 物体检测
    阿里云企业版实例迁移工具最佳实践
    Redis 线程模式
    C Primer Plus(6) 中文版 第5章 运算符、表达式和语句 5.5 类型转换
    微服务——服务治理
    【Bug——VMware Workstation】虚拟机桥接网络没有 VMnet0
    Talk预告 | FAIR研究科学家刘壮:高效和可扩展的视觉神经网络架构
    java-springboot基于机器学习得心脏病预测系统 的设计与实现-计算机毕业设计
    【电子通识】PE和SQE是什么职位
  • 原文地址:https://blog.csdn.net/qq_26540577/article/details/126539574