Я создаю шейдер, который будет иметь дело, скажем, с 10 точечными источниками света для сцены;но у меня проблемы с "до". Вот что я хочу сделать:
vec3 temp = CalcPointLight(pointLights[1], norm, FragPos, viewDir, fragDiffuse, fragSpecular);
temp *= (1.0 - ShadowCalculationPointLight(FragPos, pointLights[1].position, pointLights[1].shadowCubeMap));
temp *= pointLights[1].use;
result += temp
Итак, у меня есть массив структур pointLights
, и я просто сделаю то же самое для всех 10 из них, и чтобы избежать ветвления, добавивif
операторов, чтобы проверить, равен ли атрибут use
1, я умножаю результат вычисления света / тени на pointLights[1].value
.
Но по некоторым причинам кажется, что если различные атрибутыpointLights[1]
не инициализируются, тогда переменная result
(которая позже отправляется как цвет фрагмента) больше не рисуется, даже если предполагается, что вектор temp
умножается на 0.
ToУ меня есть два решения этой проблемы: либо я должен сгенерировать / написать шейдер для каждого количества точечных источников света, с которыми мне приходится иметь дело (поэтому, если я хочу использовать до 10 источников света, мне придется написать 11 различных шейдеров);или я всегда инициализирую все свои 10 источников света значениями, которые заставят мои функции всегда возвращать (0,0,0)
. Для последнего решения я не уверен, как инициализировать samplerCube
таким образом, чтобы он содержал исключительно 0s ... Или есть другое решение?
РЕДАКТИРОВАТЬ: я пытаюсь реализовать второе решение, но какЯ упоминал ранее, но снова, как я должен инициализировать samplerCube? Должен ли я загрузить 6 текстур размером 1x1px в виде кубической карты в память графического процессора, и когда я захочу инициализировать униформу в своих шейдерах, отправьте эту «пустую» кубическую карту, или есть более причудливый способ сделать это (имея сэмплердаешь только (0,0,0,1))?