У меня есть шейдер, который вычисляет значения рассеянного освещения. Он состоит из вершины и фрагментного шейдера, который рассчитывает интенсивность освещения для каждой вершины. Однако, как и следовало ожидать, если у меня есть большой GL_TRIANGLE
с позицией освещения, скажем, чуть выше центра треугольника, свет, который должен его освещать, не появляется, потому что значения света плавно интерполируются по поверхности треугольника на основе расчетов вершин.
Итак, мой вопрос заключается в следующем: как примитив может быть освещен источником света в месте, отличном от одной из его вершин?
Когда вы делаете освещение в вершинах, вы делаете Фонг освещения, который вычисляет цвет в вершинах, а затем просто интерполирует цвета, вычисленные в вершинах (то есть, затенение Гуро) по всем пикселям в примитиве. Если бы вы вычислили цвет освещения для каждого пикселя, вы бы получили Фонг затенение. Учитывая ваш сценарий, если вы переместите вычисления освещения из вершинного шейдера в фрагментный шейдер и интерполируете нормаль по примитиву, вы получите гораздо лучшие результаты.
Если вы сделаете вершину нормальной переменная переменная и нормализуйте его в фрагментном шейдере, а затем сделайте ваши расчеты освещения, вы должны получить гораздо лучшие результаты.
Других решений пока нет …