HLSL: я не могу изменить однородные переменные внутри вершинной программы?(массивы) - PullRequest
0 голосов
/ 02 апреля 2019

Я снова погружаюсь в изучение шейдеров и пытаюсь лучше понять, как они работают, и у меня возникают проблемы с изменением значений унифицированного массива в вершинной программе моего шейдера, а затемПередача и использование этих значений в программе фрагментов.


Я использую этот шейдер для выполнения некоторых вычислений над «Объектом 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

Использование закомментированных строк работает, но это сильно ограничивает функциональностьмой шейдер.

Почему я не могу изменить значения массива в вершинной программе, если я объявляю его вне структуры?Есть ли способ сделать это?

Есть ли другие подходы, которые я должен использовать, когда речь идет об использовании больших массивов так, как я намереваюсь (изменение и использование их значений напрограммы вершин / фрагментов?

Я немного растерялся, любая информация по этому поводу очень ценится. Заранее спасибо!

1 Ответ

0 голосов
/ 04 апреля 2019

Я использовал лучший подход для этого, который не требует необходимости изменять унифицированные переменные внутри шейдера или объявлять их внутри структуры.

Предоставление всех значений для унифицированных массивов из внешнего источникаа затем выполнение расчета расстояния + выполнение сброса пикселей дает мне желаемые результаты.

...