Я пытаюсь разработать фрагментарный шейдер, который исчезает до 0, где нормали лица перпендикулярны направлению камеры «камеры». (Это для сферической атмосферы планеты, я хочу, чтобы они исчезли в их внешнем масштабе).Точно передавая относительное положение игрока в AGAL
У меня установлена игра, так что игрок всегда находится в позиции «Вселенная» 0, 0, 0, и все объекты имеют свой transform.matrix3Ds, перемещаемый вокруг игрока по мере его перемещения.
Я должен указать, что у меня есть несколько шейдеров, работающих нормально, некоторые из них включают смешивание текстур, интерполирование между двумя моделями и зеркальное затенение; ЭТОТ проблема, однако, заставила меня победить.
Я думал, что шейдер фрагмента должен знать направление для игрока (чтобы он мог проецировать произведение между текущим лицом в обычном направлении и направлением игрока). Но ему также необходимо иметь текущую вершинную позицию модели (т. Е. Положение вывода вершины, которое в данный момент выполняется шейдером), добавленное в направлении камеры обратного игрока; таким образом, направление камеры с поверхности этой модели будет правильным.
Ну, очевидно, нет. (Я мог бы объяснить, что я делаю, но я могу почувствовать, что люди игнорируют этот вопрос уже ...). Может ли кто-нибудь сказать мне, КАК Я могу правильно рассчитать направление для игрока, учитывая, что мне также нужно включить (Я ДУМАЮ), что позиции вершин модели «смещены» от центральной позиции модели? Это было в моей голове!
Спасибо.
EDIT
Вот соответствующий код AS3 следуют гал:
// invMatrix is a cloned and inverted copy of the Planet object's transform.matrix3D...
// .deltaTransformVector ONLY uses the matrix3D's rotation to rotate a vector3D...
var tempVector:Vector3D = invMatrix.deltaTransformVector(transform.matrix3D.position);
tempVector.normalize();
context3D.setProgramConstantsFromVector(Context3DProgramType.VERTEX, 5, Vector.<Number>([-tempVector.x, -tempVector.y, -tempVector.z, 0]));
context3D.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 7, rotMatrix, true);
... other constants set here ...
context3D.setVertexBufferAt(3, mesh.normalsBuffer, 0, Context3DVertexBufferFormat.FLOAT_3);
В вершинного шейдера:
"m44 v3, va3, vc7 \n" + // passed rotMatrix is used to rotate the face normals
"dp3 v4, vc5, va3 \n" + // put the dot product of the normalised, rotated camera position and the rotated normal in v4
Затем в пиксельный шейдер:
"mul ft0, ft0, v4 \n" + // multiply the sampled texture in ft0 by the passed dot product in v4
Но это все делает для какого-то странного поведения рендеринга, где половина атмосферы кажется вытянутой, в зависимости от вашего положения относительно планеты. Озадачивает. Любая помощь хорошо оценивается.
Спасибо за ответ. Я не вдавался в слишком подробно, извините, но то, что вы описываете, - это то, что я делаю.Я передаю обратное положение объекта в шейдер фрагмента. Я также передаю матрицу вращения объекта и поворачиваю ее с вершинами. Затем я добавляю повернутую позицию вершин к позиции обратного объекта. Это должно дать мне направление на камеру из фрагмента, вычисленного шейдером, но то, что я вижу, отображается не выглядит так, как я ожидаю. Похоже, что больше атмосферы «рисуется» вверху и внизу модели. Есть идеи? – moosefetcher
Это кажется правильным. Но позвольте мне прояснить некоторые шаги. 1. Вам нужно сделать такие вычисления в вершинном шейдере. Почему вы передали обратную позицию объектов для фрагментарного шейдера? И почему обратный? 2. Вы упомянули, что вы передаете матрицу вращения. В флеш-шейдере тоже? Ваш объект does't переводит? – nikitablack
Я передаю матрицу вида модели (ее комбинированный перевод, масштаб и вращение) для регистрации vc0. Я попытался преобразовать вершинный буфер модели этим регистром (как вы говорите, это делается в вершинном шейдере), а затем передать результат в шейдер фрагмента, но это тоже не сработало. Я попробую еще раз и посмотрю, как я нахожусь. Я делаю вычисление точечного продукта в шейдере фрагмента, потому что я использую это, чтобы определить, как набирается MUTCH образцовой текстуры на этом пикселе. – moosefetcher