2015-01-21 2 views
1

У меня установлен очень простой шейдер фрагмента, содержащий направленный свет. Я пытаюсь зажечь один квад, используя этот направленный свет, и все, кажется, работает по назначению, но у меня есть один вопрос: Если обе стороны этого плоского квадроцикла будут затронуты направленным светом?Работает ли это освещение OpenGL по назначению?

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

ответ

0

Это нормально, потому что задняя поверхность вашего квадроцикла - это «тот же квад», что и передняя грань. Они имеют одинаковое нормальное значение, поэтому освещение дает тот же результат. Если вы этого не хотите, два решения:

  1. Включить отбрасывание задней поверхности. Ты больше не увидишь заднего лица. Если вам нужно что-то увидеть, нарисуйте еще один квад, но ориентируйтесь в другом направлении.
  2. В вашем фрагменте шейдера, тест gl_FrontFacing. Если это неверно, отрицайте нормальный. Это можно сделать без ветки с чем-то вроде этого:

    normal = gl_FrontFacing? normal: -normal;

+0

Я не понимаю, что вы говорите в первом абзаце. Скажем, источник света находится где-то впереди. Так как нормальная та же самая, задняя сторона должна выглядеть темнее, так как нормальная точка от света, когда видна задняя сторона (т. Е. Ориентирована на зрителя). Таким образом, обе стороны были бы одинаково яркими, если бы реализовано двухстороннее освещение, как описано в пункте 2. –

+0

BTW, оператор '?' Подразумевает ветвь. Это просто ярлык для оператора 'if'. –

+0

Предположим, что источник света находится впереди, а нормальная точка направлена ​​к нему. Квадрат горит. То же самое для заднего лица и переднего лица, это то же самое. Они освещены, потому что нормальные точки направлены на свет. Если вы поместите камеру за квадроцикл, она не изменит ее нормальную, она останется на свет. Яснее? – Jerem

Смежные вопросы