我再次潜入学习着色器并试图更好地理解它们的工作方式,我在修改着色器的顶点程序中修改均匀数组的值时遇到问题,然后传递并使用这些值片段程序。
我正在使用这个着色器对“对象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
使用注释行可以工作,但这极大地限制了着色器的功能。
如果我在结构外声明它,为什么我不能修改顶点程序中数组的值?有没有办法做到这一点?
当我打算以我想要的方式使用大型数组时,是否还有其他方法可以采用(在顶点/片段程序中使用它们的值?
我有点迷失在这一点上,对此的任何信息都非常感谢。谢谢!
我使用了更好的方法,不需要修改着色器内的统一变量或在结构中声明它们。
从外部源提供统一数组的所有值,然后进行距离计算+进行像素丢弃,可以得到我想要的结果。