HLSL:我不能在顶点程序中修改统一变量吗? (数组)
HLSL: Can't I modify uniform variables inside the vertex program? (arrays)
我正在重新学习着色器并试图更好地了解它们的工作方式,但我在修改我的顶点程序中统一数组的值时遇到了问题着色器,然后在片段程序中传递和使用这些值。
我正在使用此着色器对 "Object A" 进行一些计算,其中包含着色器,基于一堆对象的局部矩阵 "Objects B"。
我在顶点程序中使用这些矩阵将它们与 "Object A" 的顶点的局部位置相乘,然后我想将这些结果存储在一个数组中并传递给片段程序。
如果我把我想修改的数组放在结构中,顶点和片段程序使用语义TEXCOORD[=,我可以让它工作45=] 但这将该数组的大小限制为 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
使用注释行可行,但这极大地限制了我的着色器的功能。
如果我在结构之外声明它,为什么我不能在顶点程序中修改数组的值?有什么办法吗?
在按照我打算的方式使用大型数组时,我是否应该采取任何其他方法(在 vertex/fragment 程序中更改和使用它们的值?
我有点迷失在这方面,关于这方面的任何信息都非常 appreciated.Thanks 提前!
为此我使用了一种更好的方法,不需要在着色器中修改统一变量或在结构中声明它们。
从外部源提供统一数组的所有值,然后进行距离计算 + 进行像素丢弃,即可得到我想要的结果。
我正在重新学习着色器并试图更好地了解它们的工作方式,但我在修改我的顶点程序中统一数组的值时遇到了问题着色器,然后在片段程序中传递和使用这些值。
我正在使用此着色器对 "Object A" 进行一些计算,其中包含着色器,基于一堆对象的局部矩阵 "Objects B"。
我在顶点程序中使用这些矩阵将它们与 "Object A" 的顶点的局部位置相乘,然后我想将这些结果存储在一个数组中并传递给片段程序。
如果我把我想修改的数组放在结构中,顶点和片段程序使用语义TEXCOORD[=,我可以让它工作45=] 但这将该数组的大小限制为 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
使用注释行可行,但这极大地限制了我的着色器的功能。
如果我在结构之外声明它,为什么我不能在顶点程序中修改数组的值?有什么办法吗?
在按照我打算的方式使用大型数组时,我是否应该采取任何其他方法(在 vertex/fragment 程序中更改和使用它们的值?
我有点迷失在这方面,关于这方面的任何信息都非常 appreciated.Thanks 提前!
为此我使用了一种更好的方法,不需要在着色器中修改统一变量或在结构中声明它们。
从外部源提供统一数组的所有值,然后进行距离计算 + 进行像素丢弃,即可得到我想要的结果。