Невозможно использовать кубическую карту и 2D текстуру одновременно - PullRequest
1 голос
/ 13 июля 2020

Создает карту теней с 2D текстурой, а кубическая карта содержит сияние. Когда я получаю значения из каждого и визуализирую, они отображаются правильно. Однако, когда я вычисляю два значения, отображается только цвет glClearColor (), и объект исчезает.

layout(location = 0) out vec4 color;

in vec2 ShadowTexCoord;

uniform sampler2D ShadowMap;
uniform samplerCube CubeMap;

void main() {
  color = texture2D(ShadowMap, ShadowTexCoord);
}

Этот результат отображает область, освещенную прямым светом.

layout(location = 0) out vec4 color;

in vec2 ShadowTexCoord;

uniform sampler2D ShadowMap;
uniform samplerCube CubeMap;

void main() {
  color = texture(CubeMap, WorldPosition - CubePos);
}

Этот результат отображает значение яркости, полученное в предварительном расчете.

layout(location = 0) out vec4 color;

in vec2 ShadowTexCoord;

uniform sampler2D ShadowMap;
uniform samplerCube CubeMap;

void main() {
  color = texture2D(ShadowMap, ShadowTexCoord) * texture(CubeMap, WorldPosition - CubePos);
}

Этот результат должен отображаться только для значения яркости в диапазоне, освещенном прямым светом. Оба они дают правильный результат, но когда я вычисляю их каждое значение, единственным результатом является glClearColor ().

Каковы возможные факторы?

1 Ответ

1 голос
/ 13 июля 2020

Вам необходимо использовать разные текстурные блоки для ваших двух текстур. Даже если каждый текстурный блок в GL имеет свой слот привязки для разных типов текстур (1D, 2D, 3D, Cube, 1D Array, 2D Array, Cube Array и т.д.), только одна текстура может доступ через каждый блок текстуры во время вызова отрисовки (то есть все обращения к текстуре, которые вы делаете на всех этапах шейдера).

Так что это нормально, если у вас есть как 2D-текстура, так и привязка кубической карты к модуль 0, и выполнить один вызов отрисовки, который принимает модуль 0 через sampler2D, а затем переключиться на программу, которая обращается к модулю 0 через samplerCube, но она завершится неудачно, как только программа попытается получить доступ к модулю 0 более чем на один тип пробоотборника.

...