HLSL:我不能在顶点程序中修改统一变量吗? (阵列)

问题描述 投票:0回答:1

我再次潜入学习着色器并试图更好地理解它们的工作方式,我在修改着色器的顶点程序中修改均匀数组的值时遇到问题,然后传递并使用这些值片段程序。


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

我在顶点程序中使用这些矩阵将它们与“对象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

使用注释行可以工作,但这极大地限制了着色器的功能。

如果我在结构外声明它,为什么我不能修改顶点程序中数组的值?有没有办法做到这一点?

当我打算以我想要的方式使用大型数组时,是否还有其他方法可以采用(在顶点/片段程序中使用它们的值?

我有点迷失在这一点上,对此的任何信息都非常感谢。谢谢!

arrays matrix multiplication hlsl uniform
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.