생성 된 모양에 대한 법선을 계산하는 세 가지 방법이 주로 있습니다.
분석 법선
경우에 따라 법선을 생성하기에 표면에 대한 충분한 정보가 있습니다. 예를 들어, 구에있는 점의 법선은 계산하기가 쉽지 않습니다. 간단히 말해서 함수의 미분을 알면 정상도 알 수 있습니다.
분석 법선을 사용할 수있을 정도로 케이스가 좁 으면 정확도면에서 최상의 결과를 얻을 수 있습니다. 이 기술은 확장 성이 좋지 않습니다. 분석 법선을 사용할 수없는 경우도 처리해야하는 경우 일반적인 경우를 처리하고 분석법을 삭제하는 기술을 유지하는 것이 더 쉬울 수 있습니다.
정점 법선
두 벡터의 교차 곱은 속한 평면에 수직 인 벡터를 제공합니다. 따라서 삼각형의 법선을 얻는 것은 간단합니다.
vec3 computeNormal(vec3 a, vec3 b, vec3 c)
{
return normalize(crossProduct(b - a, c - a));
}
또한, 위의 예에서 교차 곱의 길이는 abc 내부 영역에 비례합니다 . 따라서 여러 삼각형이 공유하는 정점에서 평활 된 법선은 교차 곱을 합산하고 마지막 단계로 정규화하여 각 삼각형의 면적에 가중치를 부여하여 계산할 수 있습니다.
vec3 computeNormal(vertex a)
{
vec3 sum = vec3(0, 0, 0);
list<vertex> adjacentVertices = getAdjacentVertices(a);
for (int i = 1; i < adjacentVertices; ++i)
{
vec3 b = adjacentVertices[i - 1];
vec3 c = adjacentVertices[i];
sum += crossProduct(b - a, c - a);
}
if (norm(sum) == 0)
{
// Degenerate case
return sum;
}
return normalize(sum);
}
쿼드로 작업하는 경우 사용할 수있는 좋은 트릭이 있습니다 : 쿼드 abcd의 경우 사용 crossProduct(c - a, d - b)
하면 쿼드가 실제로 삼각형 인 경우를 잘 처리합니다.
Iñigo quilez는 주제에 관한 짧은 기사를 작성했습니다 : 메시의 영리한 정규화 , n면 다각형의 법선 및 면적 .
부분 도함수의 법선
부분 미분으로부터 프래그먼트 셰이더에서 법선을 계산할 수 있습니다. 스크린 공간에서 수행되는 것을 제외하고는 수학이 동일합니다. Angelo Pesce의이 기사는 기술을 설명합니다 : 법선없는 법선 .