반짝이 효과를 만들려면 어떻게해야합니까?


9

실시간 셰이더에 반짝이는 효과를 만들려고하지만 방법을 모르겠습니다.

여기에 하나의 와 다른 예가 있습니다.

여기에 이미지 설명을 입력하십시오

이것을 구현하기 위해 어떤 기술을 사용할 수 있습니까?


블룸과 유사하지만 다운 샘플 단계에 패턴 (별 질감)을 적용한 후 처리 효과를 통해 달성 할 수 있습니다. 이것은 모두 추측에 불과합니다.
akaltar

1
노멀 맵과 스페 큘러 맵으로 텍스처를 통해이 작업을 수행 할 수 있습니까?
JohnB

노멀 맵을 사용하여 테스트했습니다. 그러나 어려운 점은 뷰 방향과 빛 방향에 따라 반짝이게 만드는 것입니다.
MaT

답변:


10

음, 쉐이더를 디자인하라는 요청을 받으면 작은 문제로 세분화해야합니다. 그리고 반짝이는 효과가 실제로 쉐이더를 멋지게 보이게하지는 않지만 그 중 하나만 사용하면 전체적인 조명과 효과가 좋지 않습니다.

우선 셰이더의 일부가 아닌 것을 설명해 드리겠습니다.

  1. 섀도 잉은 셰이더의 일부가 아니며 별도의 섀도 잉 패스를 통해 수행됩니다.
  2. 나는 가정 (질문에 표시된이 이미지는 특히 실시간 렌더링을 사용하지 않고, 그 가정의 특히 있음) 주변 폐색이 있습니다.

둘째, 실제 셰이더를 별도의 효과로 나누겠습니다.

  1. 조명과 같은 이방성 (anisotropic)이 있는데, 이것은 쉐이더의 전체적인 모습에 매우 중요합니다. 그 이유는 실제 재료에 직물이 포함되어 있기 때문에이 반짝이는 직물은 빛의 반사가 방향성 바이어스를 가지므로 특정 방향으로 반사되는 빛의 이 가장 많기 때문 입니다.

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오 이러한 직물에는 무한히 많은 법선이 있지만 여기에 설명 된 기술 은 가장 중요한 법선에 가깝습니다.

가장 중요한 법선을 근사하기 위해 한 가지 방법은 텍스처 좌표를 사용하고 메쉬의 탄젠트를 계산하는 대신 N 을 계산하는 것입니다 . L 1- (NT)를 계산합니다.

여기에 전체 설명이 있습니다 . 그리고 아마도 그들이 말하는 정점 기법보다는 프래그먼트 셰이더로 구현해야 할 것입니다. 다른 이방성 모델도 적용될 수 있습니다.

이제 반짝이는 효과 :

월드 공간 / 로컬 텍스처 공간 또는 화면 공간에서 별도의 패스로 수행 할 수 있습니다.

내가 생각할 수있는 알고리즘은 이미지 처리 기술을 사용합니다 (메쉬에 텍스처 좌표가 있다고 가정).

  • 텍스처 좌표를 사용하여 메시 표면에 고주파수 2D 노이즈를 생성하면 펄린 노이즈 가 좋은 후보로 보입니다.
  • 노이즈에 3x3 커널을 사용하여 최대 필터를 적용하십시오. 이것은 아래 이미지와 비슷한 효과를 생성하며 max 필터는 여기 에 설명되어 있습니다 .

여기에 이미지 설명을 입력하십시오

위의 이미지는 max 필터의 예일 뿐이며 노이즈에 적용하면 sth가 별 필드와 유사합니다.

  • 이 작업을 완료 한 후 노이즈에 대해 특정 편차가있는 가우스 필터를 적용하면 별 모양이됩니다.

여기에 이미지 설명을 입력하십시오

최대 (ed) 노이즈에 적용된 가우시안 필터의 예.

  • 마지막 단계는 이것을 오리지널 메쉬 텍스처와 라이트와 결합하는 것입니다. 이것은 원래 메쉬 텍스처 / 색상으로 (|) or-ing 바이너리 작업을 사용하는 것이 가장 좋습니다. 노이즈에서 흰색 만 가져오고 검은 픽셀을 제거합니다. 라이트 (및 다른 스페 큘러 맵)와 관련하여 가장 좋은 방법은 추가하거나 이전에 결합한 픽셀로 조정하는 것입니다. 더 나은 글로우를 위해 글로우 후 처리 효과가 필요할 수도 있습니다.

이 기법은 실시간 셰이더를 위해 상당한 최적화가 필요할 수 있습니다.


3

흥미로운 기사 인 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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.