2013-11-25 5 views
0

Я пытаюсь разработать фрагментарный шейдер, который исчезает до 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 

Но это все делает для какого-то странного поведения рендеринга, где половина атмосферы кажется вытянутой, в зависимости от вашего положения относительно планеты. Озадачивает. Любая помощь хорошо оценивается.

ответ

1

Вам нужно найти вектор от вершины до некоторой точки в пространстве? Если это так, вам просто нужно работать в одном кадре, скажем, в мировом кадре. Для этого вам нужно знать желаемую позицию в мировом пространстве, и вам нужно преобразовать ваши вершины в мировое пространство (просто умножьте на матрицу модели).

+0

Спасибо за ответ. Я не вдавался в слишком подробно, извините, но то, что вы описываете, - это то, что я делаю.Я передаю обратное положение объекта в шейдер фрагмента. Я также передаю матрицу вращения объекта и поворачиваю ее с вершинами. Затем я добавляю повернутую позицию вершин к позиции обратного объекта. Это должно дать мне направление на камеру из фрагмента, вычисленного шейдером, но то, что я вижу, отображается не выглядит так, как я ожидаю. Похоже, что больше атмосферы «рисуется» вверху и внизу модели. Есть идеи? – moosefetcher

+0

Это кажется правильным. Но позвольте мне прояснить некоторые шаги. 1. Вам нужно сделать такие вычисления в вершинном шейдере. Почему вы передали обратную позицию объектов для фрагментарного шейдера? И почему обратный? 2. Вы упомянули, что вы передаете матрицу вращения. В флеш-шейдере тоже? Ваш объект does't переводит? – nikitablack

+0

Я передаю матрицу вида модели (ее комбинированный перевод, масштаб и вращение) для регистрации vc0. Я попытался преобразовать вершинный буфер модели этим регистром (как вы говорите, это делается в вершинном шейдере), а затем передать результат в шейдер фрагмента, но это тоже не сработало. Я попробую еще раз и посмотрю, как я нахожусь. Я делаю вычисление точечного продукта в шейдере фрагмента, потому что я использую это, чтобы определить, как набирается MUTCH образцовой текстуры на этом пикселе. – moosefetcher

0

OK - спасибо, Volgogradetzzz, за ваш ответ; вы определенно заверили меня, что я думаю в правильном направлении ». В конечном итоге это стало вопросом правильности многих вещей. Я закончил:
1) прохождение относительного поворотного положения камеры с помощью камеры в шейдер.
2) вращение вершин и нормальных буферов в вершинном шейдере, с помощью матрицы вращения объекта (которая включает в себя шкалу, но не позиционный перевод)
3) наконец, ключевым моментом является СУБТРАКЦИЯ положения повернутой вершины с камеры положение в фрагментном шейдере
Итак - он, наконец, работает! (Ну, ЭТО была неделя моей жизни, я никогда не вернусь).

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