Я пытаюсь разработать фрагментный шейдер, который исчезает до 0, где нормали граней перпендикулярны направлению «камеры» игрока. (Это касается атмосфер сферических планет; я хочу, чтобы они исчезли во внешнем пространстве).
У меня игра настроена так, что игрок всегда находится в «позиции вселенной» 0, 0, 0, и все объекты имеют свои transform.matrix3Ds, перемещаемые вокруг игрока, когда он движется.
Я должен отметить, что у меня несколько шейдеров работают нормально, некоторые из них включают смешивание текстур, интерполяцию между двумя моделями и зеркальное затенение; ЭТА проблема, однако, меня одолела.
Я думал, что шейдер фрагмента должен знать направление к игроку (чтобы он мог скалярно произведение между текущей нормалью лица и направлением игрока). Но также необходимо, чтобы «текущая» позиция вершины модели (т. Е. Выходная позиция вершины, отрисовываемая шейдером в данный момент) была добавлена к обратному направлению камеры игрока; таким образом направление на камеру от местоположения поверхности модели будет правильным.
Ну, видимо, нет. (Я мог бы объяснить, чем занимаюсь, но чувствую, что люди уже игнорируют этот вопрос ...). Может ли кто-нибудь сказать мне, КАК я могу правильно рассчитать направление на игрока, учитывая, что мне также нужно включить (Я ДУМАЮ) тот факт, что положения вершин модели «смещены» от центрального положения модели? Это делало мне голову!
Спасибо.
ИЗМЕНИТЬ
Вот соответствующий код AS3, за которым следует AGAL:
// 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
Но все это приводит к некоторому странному поведению при рендеринге, когда половина атмосферы кажется нарисованной, в зависимости от вашего положения относительно планеты. Непонятно. Любая помощь приветствуется.