답변:
음, 쉐이더를 디자인하라는 요청을 받으면 작은 문제로 세분화해야합니다. 그리고 반짝이는 효과가 실제로 쉐이더를 멋지게 보이게하지는 않지만 그 중 하나만 사용하면 전체적인 조명과 효과가 좋지 않습니다.
우선 셰이더의 일부가 아닌 것을 설명해 드리겠습니다.
둘째, 실제 셰이더를 별도의 효과로 나누겠습니다.
이러한 직물에는 무한히 많은 법선이 있지만 여기에 설명 된 기술 은 가장 중요한 법선에 가깝습니다.
가장 중요한 법선을 근사하기 위해 한 가지 방법은 텍스처 좌표를 사용하고 메쉬의 탄젠트를 계산하는 대신 N 을 계산하는 것입니다 . L 1- (NT)를 계산합니다.
여기에 전체 설명이 있습니다 . 그리고 아마도 그들이 말하는 정점 기법보다는 프래그먼트 셰이더로 구현해야 할 것입니다. 다른 이방성 모델도 적용될 수 있습니다.
이제 반짝이는 효과 :
월드 공간 / 로컬 텍스처 공간 또는 화면 공간에서 별도의 패스로 수행 할 수 있습니다.
내가 생각할 수있는 알고리즘은 이미지 처리 기술을 사용합니다 (메쉬에 텍스처 좌표가 있다고 가정).
위의 이미지는 max 필터의 예일 뿐이며 노이즈에 적용하면 sth가 별 필드와 유사합니다.
최대 (ed) 노이즈에 적용된 가우시안 필터의 예.
이 기법은 실시간 셰이더를 위해 상당한 최적화가 필요할 수 있습니다.
흥미로운 기사 인 AMD – 절차 받기가 있습니다.
반짝임은 생각보다 어렵습니다.
괜찮은 해결책 : 3D 위치를 사용하여 3D 노이즈 함수를 인덱싱하고, 뷰 벡터를 추가하고, frac 함수를 사용하여 사물을 더 무작위 화하십시오.
Sparkle:
float specBase = saturate(dot(reflect(-normalize(viewVec), normal),
lightDir));
// Perturb a grid pattern with some noise and with the view-vector
// to let the glittering change with view.
float3 fp = frac(0.7 * pos + 9 * Noise3D( pos * 0.04).r + 0.1 * viewVec);
fp *= (1 - fp);
float glitter = saturate(1 - 7 * (fp.x + fp.y + fp.z));
float sparkle = glitter * pow(specBase, 1.5);