То, что вы в основном хотите сделать в своем шейдере, это вычислить диффузное затенение заданной точки на сфере.Для этого вам в основном понадобятся две вещи: во-первых, нормаль к поверхности в той точке сферы, которую вы хотите заштриховать, и, во-вторых, направление, откуда свет падает на точку, которую вы хотите заштриховать.Теперь, прежде чем вы сможете продолжить и рассчитать затенение объекта в данной точке, вам, как правило, нужно знать фактическое положение той конкретной точки, которую вы хотите заштриховать.Поскольку вы на самом деле не предоставили никакого объяснения того, что именно вещи типа ray.dir
фактически представляют в вашем коде, мне придется прибегнуть к догадкам.Я предполагаю, что вы делаете что-то вроде трассировки лучей в фрагментном шейдере.И я должен предположить, что ray.dir
- это не просто какой-то вектор, указывающий в общем направлении луча, попадающего на сферу в интересующей вас точке, а на самом деле это вектор , которыйприведет вас от начала луча к точной точке попадания на сферу.В противном случае вам не хватает самой важной информации, чтобы действительно что-то сделать, это координаты точки, которую вы хотите заштриховать.В этом случае вам сначала нужно будет вычислить, где находится фактическое пересечение вашего луча и вашей сферы.
Теперь, если мы сделаем все эти предположения и, кроме того, предположим, что все эти векторы, которые вы имеете, действительно представляюткоординаты в той же системе координат, то ray.origin + ray.dir - my_sphere.center
должен действительно дать вектор, указывающий от центра сферы к точке, которую вы хотите заштриховать.И этот вектор действительно должен указывать в направлении нормали поверхности сферы в точку, которую вы хотите заштриховать.Тем не менее, вторым вектором, который вам нужен для вычисления диффузного затенения, является вектор, указывающий в направлении, откуда свет падает на точку, которую вы хотите затенить.То есть вектор, указывающий от точки затенения к источнику света.Тем не менее, my_point_lights[temp].location - ray.origin
может показаться вектором, указывающим от источника луча на источник света.
Помимо этого, вам, вероятно, следует обратить ваше внимание на то, что, в отличие от того, что вам кажетсяПо впечатлению, функция normalize(x)
не изменяет вектор, который вы передаете в качестве аргумента.Он просто возвращает другой вектор, который является нормализованной версией любого вектора, который вы передаете ему.Так что, скорее всего, вы на самом деле хотели написать:
n = normalize(n);
…
L = normalize(L);
Кроме того, вы накапливаете значения в color
и diff
, но никогда не инициализируете эти векторы.Вы, вероятно, хотели инициализировать их нулями ... 101