2013-04-06 5 views
1

Я пытаюсь создать шейдер с bump-mapping.Как объединить карту рельефа нормальный и нормальный?

У меня есть реальный нормальный объект, и у меня есть нормальная выборка. То, что я хотел бы сделать, это повернуть дискретированный нормальный режим так, чтобы «вверх» на выбранных нормальных точках в направлении реального нормали.

Я работаю над математикой, и я не могу понять, что это правильно ... Я в этом мире.

// Vertex shader sends this matrix to the pixel shader 
OUT.normal[0] = mul((float3x3)world, normal); 
float3 temptan = cross(normal, float3(0, 0, 1)); 
temptan = normalize(temptan); 
OUT.normal[2] = mul((float3x3)world, temptan); 
OUT.normal[1] = cross(OUT.normal[0], OUT.normal[2]); calculating binormal (in world space) 

// Pixel Shader: 
// Get normal from bump texture 
float3 normal = tex2D(normalmap, texCoord); 
normal = normal * 2 - 1; 
// Swap Z and Y, since Z is up on the texture, but Y is up in this world. 
float temp = normal[1]; 
normal[1] = -normal[2]; 
normal[2] = temp; 
// Multiply the sampled normal and the normal-basis matrix together. 
normal = mul(normalMat, normal); 

ответ

4

Если вы хотите использовать нормальное отображение (это то, что вы на самом деле подразумеваем под «рельефное текстурирование») нужны два дополнительных векторов для того, что вы собираетесь делать: касательные и BINORMAL. Тангенциальные и бинормальные рассчитываются по нормалям геометрии и текстурному пространству «карты рельефа».

я объясню, как это сделать в →my answer to StackOverflow question "How to calculate Tangent and Binormal?"

Нормальных, касательные и бинормальный образуют систему координат, представима в виде матрицы 3 × 3. Эта матрица на самом деле является матрицей вращения, необходимой для преобразования нормального отображения в локальное пространство модели, так что вы можете использовать его для расчета освещенности. Короче говоря, вы умножаетесь на матрицу, образованную треногой этих трех векторов.

+0

Спасибо! Я прочитаю вашу статью. Я думаю, что я пытался сделать то, что вы сказали выше, но мне это не совсем понятно. – yellow

+0

Обратите внимание, что это только в случае, если вы говорите о нормальных картах tangentspace, если у вас есть нормали в мире или в пространстве объектов, это не нужно. –

+0

@RobertJ .: Мировые космические нормали очень необычны, а нормальные пространства объектов создают массу проблем, как только вы используете скелетную анимацию. Но вы правы, конечно. – datenwolf

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