Не-а. Не о проходах я говорил.
Ну да ладно. та проблема решена кардинально.
В данный момент решаю тему множества источников света.
Передавал в вертексный шейдер массив источников света с кучей доп. параметров. В том числе и, собственно, количество активных источников. Все работало, но, как всем понятно, расчитывать освещение в вертексном шейдере - не есть гуд.
Перекинул все параметры в пиксельный. И только размахнулся...
Я понимаю, что инты, получаемые пиксельным шейдером в параметрах, автоматом считаются флоатами. Это очевидно ввиду свойств используемых трансферных регистров - текскоорд, позишн... етк...
В общем ни у кого не возникало подозрений, что и величины, передаваемые не от ветрексного, а непосредственно из приложения, один фиг считаются интерполированными и посему флоатами?
Короче стоят рядом две строки:
float3 LightColor[50];
int LCount;
...
И при этом LightColor прекрасно обрабатывается, а LCount при любой попытке к нему обратится вообще приводит к некомпилляции шейдера.
Я теперь делаю так:
LCount = LCount + 1.3;
for( int i=0; i<50; i++ )
{
if(i<LCount)
{
...обращение к i-му источнику....
}
}
Но неужели это нормально?!?!
(Я прогаю давно, даже преклонно. Попрошу не оскорблять меня предложениями проверить арфографию. NetLib-а не касается. Ему все можно
)
Поправочка:
Мой список параметров, получаемых пиксельным шейдером от приложения:
sampler2D Texture1 : register(s0);
sampler2D Texture2 : register(s1);
sampler2D Texture3 : register(s2);
sampler3D Texture4 : register(s3);
float Bump;
float3 GlobalAmbient;
float3 Diffuse;
float3 Ambient;
float3 Specular;
float3 Emissive;
float Power;
float4 TexPos[4];
float2 LightRange[50];
float3 LightA[50];
float3 LightColor[50];
float3 LightPose[50];
float3 LightVec[50];
int LCount;
int Tip;
Позволяет обратиться к любым LightColor и прочим, в количестве не более двух - хоть к сороковому, хоть к тридцатому, но не более двух разных индексов! Остальных это правило так же касается. Так, например, корректно работает LightColor[45]+LightColor[18], так же корректно скомпилиться LightColor[1]+LightColor[18], но категорически не проканает фраза типа LightColor[1]+LightColor[18]+LightColor[45]. Это утверждение валидно для любых комбинаций индексов массивов.
Попытаюсь упредить ответ и задам встречный вопрос - ка кдолжен выглядеть код прохода по 50-и элементам массива в пиксельном шейдере? (на примере, если не трудно)