Я снова погружаюсь в изучение шейдеров и пытаюсь лучше понять, как они работают, и у меня возникают проблемы с изменением значений унифицированного массива в вершинной программе моего шейдера, а затемПередача и использование этих значений в программе фрагментов.
Я использую этот шейдер для выполнения некоторых вычислений над «Объектом A», который содержит шейдер на основе локальной матрицысвязка объектов "Объекты B".
Я использую эти матрицы в программе вершин, чтобы умножить их на локальное положение вершин "Объекта A", и затем я хочу сохранить эти результаты в массиве ипередать в программу фрагментов.
Я смогу заставить ее работать, если поместить массив, который я хочу изменить, в структуру , используемую программами вершин и фрагментов с семантическим TEXCOORD 1013 *, но это ограничивает размер этого массива до 32, что ограничивает функциональность, даже если я использовал все TEXCOORD1 <-> для TEXCOORD15.
Это также seДля меня это больше ограничений, так как я хотел бы использовать несколько массивов для хранения максимально разрешенных элементов (я считаю, что это 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
Использование закомментированных строк работает, но это сильно ограничивает функциональностьмой шейдер.
Почему я не могу изменить значения массива в вершинной программе, если я объявляю его вне структуры?Есть ли способ сделать это?
Есть ли другие подходы, которые я должен использовать, когда речь идет об использовании больших массивов так, как я намереваюсь (изменение и использование их значений напрограммы вершин / фрагментов?
Я немного растерялся, любая информация по этому поводу очень ценится. Заранее спасибо!