굴절 유리 쉐이더


10

테셀레이션 셰이더 쌍에서 점 그리드를 테셀 레이트하여 생성 된 무한 육각형 바닥이 있습니다.

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

이것은 플랫 와이어 프레임입니다. "그림자"는 조명 트릭입니다.

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

자, 이것을 두꺼운 굴절 유리처럼 보이게하고 싶지만 진행 방법을 잘 모르겠습니다.

가장 먼저 떠오른 것은

  1. 블록의 요청 된 "두께"를 포함하는 유니폼을 설정
  2. 조명을 계산할 때 Snell의 법칙을 사용하여 광선이 16 진 블록을 통과하는 광학 경로 길이를 계산합니다. 실제로 "두께"유니폼이 말하는 두께만큼 두껍다면 그 길이에 대한 알파를 합산하십시오. 그것은 투명성을 줄 것이지만 내부 반사 / TIR 등과 같은 것들을 다루지 않습니다.

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

아직 시도하지 않았으므로 시각적 결과가 무엇인지 확실하지 않습니다.

궁극적 으로이 특정 수준에서 디스크 전투 중 Tron : Legacy에서 사용 된 유리, 육각형 바닥 모양을 얻으려고합니다. ( 예를 들어이 이미지를 참조하십시오 .)

제안?


1
달성하려는 모양을 더 설명 할 수 있습니까? 트론 샷은 대부분 굴절이 아닌 반사, AFAICT를 보여줍니다. 대부분의 샷에서 플로어 플레이트를 실제로 볼 수는 없습니다. 반짝이는 표면을 원하지 않는다고 가정하면 바닥을 통해 무엇을보고 싶습니까? 보여주고 싶은 서브 플로어 텍스처가 있습니까? 바닥 아래에 전체 장면이 있습니까 (트론처럼)? 아니면 뚜렷한 이미지를 볼 수 없지만 표면 아래에 산란 효과가있는 젖빛 유리처럼 보이기를 원하십니까?
Nathan Reed

지하 산란, 그것이 그것이 무엇인지 몰랐습니다. 인터넷 검색을 더 쉽게 만듭니다. :)
3Dave

답변:


4

GPU Gems 의이 기사 는 굴절에 대해 깊이있게 다루어 꽤 좋은 결과를 줄 수 있습니다.

(a) 완전한 투명성 (b) 굴절 유리

가장 기본적인 의미에서

기본 굴절 기술의 첫 번째 단계는 장면 지오메트리를 텍스처로 렌더링하여 모든 굴절 메시를 건너 뛰는 것입니다. 이 텍스처는 후속 패스에서 렌더링 될 굴절 객체 뒤에 보이는 객체를 결정하는 데 사용할 수 있습니다. 이 텍스처를 S로 표시합니다.

두 번째 단계는 굴절 메쉬를 렌더링하여 굴절 모양을 시뮬레이션하기 위해 섭동이 적용된 텍스처 S에서 값을 찾습니다. 섭동은 노멀 맵 N을 사용하여 달성 될 수 있으며, 여기서 노멀 맵 레드 및 그린 (XY) 컴포넌트는 투영 된 텍스처 좌표에 변위를 추가하기 위해 작은 값으로 사용 및 스케일링됩니다. 이 방법은 쉐이더에서 간단하게 구현할 수 있습니다.

  1. 텍스처 N을 가져옵니다
  2. 작은 값으로 조정 된 XY 구성 요소 사용 (예 : 0.05)
  3. 이 변위 값을 S의 투영 된 텍스처 좌표에 추가

다음 목록은이 접근 방식을 보여주는 셰이더를 보여줍니다.

half4 main(float2 bumpUV : TEXCOORD0,
  float4 screenPos : TEXCOORD1,
  uniform sampler2D tex0,
  uniform sampler2D tex1,
  uniform float4 vScale) : COLOR
{
  // fetch bump texture, unpack from [0..1] to [-1..1]
  half4 bumpTex=2.0 * tex2D(tex0, bumpUV.xy) - 1.0;

  // displace texture coordinates    
  half2 newUV = (screenPos.xy/screenPos.w) + bumpTex.xy * vScale.xy;

  // fetch refraction map
  return tex2D(tex1, newUV);
}

다음 이미지는이 세 단계를 보여줍니다.

위의 셰이더에 나열된 세 단계

같은 기사에서 훨씬 더 매력적인 모습을 얻을 수있는 고급 기술이 있습니다.


유니티에서 비슷한 효과를 내기 위해, 굴절 쉐이더 위키 페이지를 보길 원할 것입니다


3

나는 당신이 보여준 이미지 를 내가 어떻게 효과를 상상하는지에 대한 참고 자료로 삼을 것 입니다. 내가 생각할 수있는 알고리즘은 간단합니다.

  1. 환경 반사를 시뮬레이션하기 위해 환경을 큐브 맵 텍스처로 렌더링합니다.
  2. 큐브 맵 텍스처를 굴절 바닥 아래의 레이어를 나타내는 평면에 적용합니다. 평면을 아직 렌더링하지 마십시오.
  3. 평면을 일반적인 2D 텍스처 인 텍스처로 렌더링합니다.
  4. 굴절 바닥을 렌더링하는 데 사용되는 굴절 쉐이더로 텍스처를 전달합니다.
  5. 이제 굴절 셰이더로 굴절 메쉬 / 바닥을 렌더링합니다.

굴절 셰이더와 관련하여 유리를 시뮬레이션하기 위해 할 수있는 일

  • 프레 넬 항을 사용하여 반사 및 굴절을 시뮬레이션합니다.
  • 노멀 / 노멀 맵을 사용하여 텍스처 가져 오기를 수행하십시오.

방금 아이디어를 생각했기 때문에 테스트하지 않았습니다. 더 많은 일이 필요하다고 확신합니다. 일을 마치고 나면 어쩌 겠어요.


흥미로운 접근법-나는 조금만 그에 대한 스튜를해야합니다. 입력 주셔서 감사합니다.
3Dave
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.