HLSL:我不能在顶点程序内修改统一变量吗? (数组)

时间:2019-04-02 19:33:47

标签: arrays matrix multiplication hlsl uniform

我将再次投入学习着色器的工作,并试图更好地了解它们的工作方式,并且在修改着色器顶点程序中的统一数组的值时遇到了麻烦,然后在片段程序中传递和使用这些值。


我正在使用此着色器根据一堆对象“对象B”的局部矩阵对保存着色器的“对象A”进行一些计算。

我在顶点程序中使用这些矩阵将它们与“对象A”的顶点的局部位置相乘,然后将这些结果存储在数组中并传递到片段程序中。

如果我将要修改的数组放入具有语义TEXCOORD 的顶点和片段程序使用的结构中,则可以使它工作,但这会限制大小该数组的大小限制为32,即使我使用了所有TEXCOORD1 <->到TEXCOORD15,也限制了功能。

这也为我设置了更多限制,因为我想使用多个数组存储每个数组允许的最大项目(我认为是1024)。


所以我很难过理解为什么如果我使用统一数组就不能在顶点程序中修改这些数组值

我的猜测是这种在顶点程序和片段程序之间传递数据的方式不起作用...


发布着色器的基本版本,排除所有不相关的代码以提高可读性

CGPROGRAM
            uniform float4x4 _MyMatrixArray [100];
            uniform float4 _WorldPositions [100];

            struct vertexInput{
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };
            struct vertexOutput{
                float4 pos : SV_POSITION;
                float2 uv: TEXCOORD0;
                //float4 _WorldPositions [32] : TEXCOORD1;
            };


            vertexOutput vert(vertexInput input)
            {
                for(int i = 0; i < 100; i++)
                {
                    //output._WorldPositions[i] = mul(_MyMatrixArray[i], worldPos);
                    _WorldPositions[i] = mul(_MyMatrixArray[i], worldPos);
                }
            }

            float4 frag(vertexOutput input) : COLOR
            {
                for(int i = 0; i < 100; i++)
                {
                    //if (length(input._WorldPositions[i].xyz) > 0.5)
                    if (length(_WorldPositions[i].xyz) > 0.5)
                    {
                        //Do stuff
                    }
                }
            }
ENDCG

使用注释行有效,但是大大限制了我的着色器的功能。

如果在结构外部声明数组,为什么不能在顶点程序中修改数组的值?有什么办法吗?

在以我打算的方式使用大型数组时(在顶点/片段程序中更改和使用其值?),我还应该采取其他方法吗?

我有点迷失了,对此的任何信息将不胜感激。谢谢!!

1 个答案:

答案 0 :(得分:0)

为此,我使用了一种更好的方法,该方法不需要修改着色器内的统一变量或在结构内声明它们。

从外部来源提供统一数组的所有值,然后进行距离计算+进行像素丢弃,得到了我想要的结果。