나는 우주에서 행성의 대기 비산을 구현하는 과정에 있습니다. http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter16.html 의 Sean O'Neil의 셰이더를 시작점으로 사용하고 있습니다.
나는이 꽤 많이 여기로 GroundFromSpace 쉐이더에 반대 SkyFromSpace 쉐이더를 제외하고 fCameraAngle에 관한 같은 문제 : http://www.gamedev.net/topic/621187-sean-oneils-atmospheric-scattering/
fCameraAngle = 1
내부 루프에서 사용하지 않을 때 공간 쉐이더에서 하늘에 이상한 유물이 나타납니다 . 이 유물의 원인은 무엇입니까? fCameraAngle이 1로 제한되면 아티팩트가 사라집니다. 또한 O'Neil의 샌드 박스에있는 색조 ( http://sponeil.net/downloads.htm ) 가없는 것 같습니다
카메라 위치 X = 0, Y = 0, Z = 500. 왼쪽은 GroundFromSpace, 오른쪽은 SkyFromSpace입니다.
카메라 위치 X = 500, Y = 500, Z = 500. 왼쪽은 GroundFromSpace, 오른쪽은 SkyFromSpace입니다.
소스에 따라 카메라 각도가 다르게 처리되는 것으로 나타났습니다.
원래 셰이더에서 SkyFromSpaceShader의 카메라 각도는 다음과 같이 계산됩니다.
float fCameraAngle = dot(v3Ray, v3SamplePoint) / fHeight;
우주 쉐이더에서지면에서 카메라 각도는 다음과 같이 계산됩니다.
float fCameraAngle = dot(-v3Ray, v3Pos) / length(v3Pos);
그러나, 다양한 소스는 온라인을 엉망으로 만든다. 왜 이런거야?
다음은 문제를 보여주고 이미지를 생성하는 데 사용한 C # Windows.Forms 프로젝트입니다. https://github.com/ollipekka/AtmosphericScatteringTest/
업데이트 : O'Neil 사이트에서 발견 된 ScatterCPU 프로젝트에서 카메라가 음영 처리 된 지점 위에있을 때 카메라 광선이 무효화되어 산란이 지점에서 카메라로 계산된다는 것을 알았습니다.
광선 방향을 실제로 변경하면 아티팩트가 제거되지만 다음 그림과 같이 다른 문제가 발생합니다.
또한 ScatterCPU 프로젝트에서 O'Neil은 빛의 광학 깊이가 0보다 작은 상황을 방지합니다.
float fLightDepth = Scale(fLightAngle, fScaleDepth);
if (fLightDepth < float.Epsilon)
{
continue;
}
의견에서 지적 했듯이이 새로운 유물과 함께 여전히 문제가 남아 있습니다. 카메라가 500, 500, 500에 위치한 이미지의 문제점은 무엇입니까? 후광이 행성의 완전히 잘못된 부분에 집중된 것 같습니다. 사람들은 빛이 태양이 밤낮으로 바뀌기보다는 행성에 닿아 야하는 지점에 더 가까울 것으로 예상합니다.
github 프로젝트는이 업데이트의 변경 사항을 반영하여 업데이트되었습니다.