평면 반사를 할 때 파도를 계산


13

나는 SDK, 특히 Island11 프로젝트 에서 Nvidia의 예제를 연구하고 있으며 파도 높이의 상태에 따라 반사를 위아래로 수정하는 HLSL 코드에 대해 궁금한 것을 발견했습니다.

당연히 간단한 코드 단락을 검토 한 후 :

// calculating correction that shifts reflection up/down according to water wave Y position
float4 projected_waveheight = mul(float4(input.positionWS.x,input.positionWS.y,input.positionWS.z,1),g_ModelViewProjectionMatrix);
float waveheight_correction=-0.5*projected_waveheight.y/projected_waveheight.w;
projected_waveheight = mul(float4(input.positionWS.x,-0.8,input.positionWS.z,1),g_ModelViewProjectionMatrix);
waveheight_correction+=0.5*projected_waveheight.y/projected_waveheight.w;
reflection_disturbance.y=max(-0.15,waveheight_correction+reflection_disturbance.y);

첫 번째 추측은 수직 섭동 (파도)을받을 때 평면 반사를 보상하고 반사 된 기하학을 아무것도없는 곳으로 옮기고 물이 마치 하늘이없는 것처럼 렌더링됩니다.

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

이제는 지형의 녹색 / 회색 / 노란색 반사가 물의 기준선으로 채워져있는 것을 볼 수있는 하늘입니다. 내 문제는 이제 그 배후의 논리가 무엇인지 정확히 알 수 없다는 것입니다. 웨이브 / 워터 지오메트리 점의 실제 월드 공간 위치를 투영 한 다음 -.5f를 곱하여 같은 점을 다시 투영하기 만합니다. 이번에는 y 좌표가 -0.8 (왜 -0.8?)로 변경되었습니다.

코드의 단서는 중복이 있기 때문에 시행 착오를 통해 도출되었음을 나타냅니다. 예를 들어, 저자는 투영 된 y 좌표의 음의 절반을 w 나누기 후 가져옵니다.

float waveheight_correction=-0.5*projected_waveheight.y/projected_waveheight.w;

그런 다음 두 번째 점에 대해서도 동일하게 수행합니다 (긍정적 인 것, 어떤 종류의 차이를 얻기 위해 가정합니다).

waveheight_correction+=0.5*projected_waveheight.y/projected_waveheight.w;

2로 나누기를 제거해도 품질 개선에 차이가 없습니다 (누군가 나를 수정하려는 경우 수행하십시오). 그것의 요점은 예상되는 y의 차이 인 것처럼 보입니다. 왜 그렇습니까? 이 중복성과 겉보기에 임의의 -.8f 및 -0.15f 선택은 이것이 휴리스틱 / 추측 작업의 조합 일 수 있다고 결론을 내 렸습니다. 이것에 대한 논리적 인 토대가 있습니까? 아니면 필사적 인 해킹입니까?

다음은 가장 작은 테셀레이션 수준에서 코드 조각으로 해결되는 초기 문제의 과장입니다. 바라건대, 내가 놓친 아이디어를 촉발시킬 수도 있습니다. -.8f는 평면적으로 반사 된 지오메트리 렌더링을 샘플링하는 텍스처 좌표를 방해하는 정도를 추론하는 기준 높이 일 수 있으며 -.15f는 보안 측정 값의 하 한일 수 있습니다.

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

답변:


1

이 기술은이 인공물을 가지고 있어야하는데, 이것이 사용되는 대부분의 시간에, 실제 반사 평면이 실제 위치보다 반 미터 이상인 것처럼 룩업에 수직 이동을 적용합니다. 그렇습니다. 반사에 완벽하게 일치하지 않는 단점이 있지만 구멍보다 선호됩니다.


2
더 정교하게 할 수 있습니까?
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.