2015-07-13 3 views
1

Цель: Рассчитать нормали в вершинном шейдере для смещенных вершин.Custom Phong Shader для объекта THREE.JS

Текущее состояние: Некоторые взломанные коды, на которые я не верю, являются 100% правильными.

--- прогресс ---

верт является модифицированной позицией вершины

vertNormal является модифицированным положение вершины применяется к нормалям (в основном клон)

vec3 objectNormal = normalize(cross(vert-position,vertNormal-position)); 
vec3 transformedNormal = normalMatrix * objectNormal; 
vNormal = normalize(transformedNormal); 

http://fallingcode.com/servedFiles/normals.jpg

Мне просто нужна некоторая обратная связь о той части вершинного кода шейдера на этом этапе.

+0

(1) Что означает «не работает»? (2) Вы перемещаете вершины. Вам тоже придется обращаться с нормалями. (3) Вы должны сначала перенести вершины/нормали, поэтому вычисления освещения вычисляются с использованием модифицированных вершин и нормалей. – WestLangley

+0

(1) Не работает, поскольку в envmap не отображается на волнистой плоскости. (2) Я понял, что, но это остановит envmap от показа в самолете? (3) Можно ли вытеснить нормали так же, как я смещал вершины? – fallingCode

+0

(re: 2) Ваши нормали все указывают в одном направлении, поэтому освещение будет неправильным. Предположительно, вы все равно увидите что-то. (re: 3) Поскольку у вас есть аналитические формулы для смещенных вершин, имеется также подразумеваемая аналитическая формула для нормалей. Что вы пытаетесь создать - плоское (граненое) затенение или гладкое затенение? – WestLangley

ответ

0

После помощи @ WestLangley, я достиг своей цели. Волны на изображении - это просто результат. Мне придется исследовать уравнения, чтобы сделать их более естественными.

Итак, нормали вычисляются правильно, и отражение окружающей среды (файл куба ТРИ.JS) также работает правильно.

http://www.fallingcode.com/servedFiles/calculatedNormals.jpg

Следующий код в вершинном шейдере что вычисляет нормали после вершины были перемещены по нормали (ось г в данном случае).

// the displacement function 
float displace(vec3 pos) { 
    float amplitude; 
    amplitude = sin(pos.y + time) * 0.1; 
    return amplitude; 
} 

float df = displace(position); 
vec3 displacedPosition = position + normalize(normal) * df; 

float delta = 0.01; 
vec3 newNormal = vec3(df - displace(position + vec3(delta, 0, 0)), df - displace(position + vec3(0, delta, 0 )), delta); 
newNormal = normalize(newNormal); 

vNormal = normalize(normalMatrix * newNormal);