Я студент в видеоиграх, и мы работаем над raytracer на C++. Мы используем библиотеку наших учителей.Нормальное отображение на процедурной сфере
Мы создаем процедурные объекты (в нашем случае сферу), Камера посылает луч для каждого пикселя экрана, а луч отправляет обратно информацию о том, что он ударил.
Некоторые из нас решили интегрировать Normal Maps. Итак, сначала мы отправили лучи на объект, посмотрели на значение Normal map texel, где мы попали в сферу, преобразовали его в вектор, нормализировали и отправили обратно вместо нормали объекта. Результат был довольно хорошим, но, конечно, он не принял ориентацию «лица» (это процедурный, так что лица нет, но он дает идею), поэтому рендер был плоским.
Мы по-прежнему не знаем, как «смешивать» нормаль текстуры (в касательном пространстве) и нормали объекта вместе. Вот наш код:
// TGfxVec3 is part of our teachers library, and is a 3d vector like this:
// TGfxVec3(12.7f, -13.4f, 52.0f)
// The sphere being at the origin and of radius 1, and tHit.m_tPosition being the
// exact position at the surface of the sphere where the ray hit, the normal of this
// point is the position hit by the ray.
TGfxVec3 tNormal = tHit.m_tPosition;
TGfxVec3 tTangent = Vec3CrossProduct(tNormal , m_tAxisZ);
TGfxVec3 tBiNormal = Vec3CrossProduct(tNormal , tTangent);
TGfxVec3 tTextureNorm = 2*(TGfxVec3(pNorm[0], pNorm[1], pNorm[2])/255)-TGfxVec3(-1.0f, -1.0f, -1.0f);
// pNorm[0], pNorm[1], pNorm[2] are respectively the channels Red, Green,
// and Blue of the Normal Map texture.
// We put them in a 3D vector, divid them by 255 so their value go from 0 to 1,
// multiply them by 2, and then substract a vector, so their rang goes from -1 to +1.
tHit.m_tNorm = TGfxVec3(tTangente.x*tTextNorm.x + tCoTangente.x*tTextNorm.x +
tNorm.x*tTextNorm.x, tTangente.y*tTextNorm.y + tCoTangente.y*tTextNorm.y +
tNorm.y*tTextNorm.y, tTangente.z*tTextNorm.z + tCoTangente.z*tTextNorm.z +
tNorm.z*tTextNorm.z).Normalize();
// Here, after some research, I came across this : http://www.txutxi.com/?p=316 ,
// that allow us to convert the normal map tangent space to the object space.
Результаты по-прежнему не очень хорошие. Моя главная забота - это тангенс и бинормалы. Ось, взятая в качестве ссылки (здесь: m_tAxisZ
, ось Z сферы), неверна. Но я не знаю, что взять, или даже если то, что я делаю, действительно хорошо. Поэтому я пришел сюда за помощью.
Я кратко изложил вопрос, надеюсь, что я не слишком сильно перерезал. – bigstones
Извините, я забыл сказать спасибо за это. На самом деле это более ясно. :) – Ellenack