당신이 경험을 요청했기 때문에 여기에 내 것이 있습니다.
PS2 게임을 프로그래밍하던 시절에 "계층화 된 알파 쿼드"접근 방식은 종종 안개를 구현하는 방식이었습니다. 간혹지면 안개처럼 보이지만 전체 화면 안개처럼 훨씬 더 일반적입니다. 그리고 두 경우 모두 잘 작동했습니다. 그렇습니다. 사전 조각화 시대에 가능했습니다.
글쎄요. 앞에서 언급했듯이 문제는 스크린 샷과 같이 부드러운 안개를 원한다면 다소 불합리한 수의 알파 쿼드가 필요하다는 것입니다.
PS2에서는 보통 3 ~ 5 개의 레이어를 사용할 수있었습니다. 당신 앞에 떠 다니는 안개의 "벽"처럼 보였습니다. 그것보다 더 많은 그리고 채우기 속도는 우리의 프레임 속도를 죽이기 시작했다.
일반적으로이 쿼드는 카메라 앞의 고정 된 거리에 그려 지므로 그중 하나를 "통과"하는 상황을 결코 경험할 수 없습니다. 반면에, 그 고정 거리를 사용하여, 세계의 다른 모든 않습니다플레이어가 움직일 때 그 평면을 통과합니다. 이것은 꽤 명백한 그래픽 결함입니다. 당시에는 거의 모든 사람들이 그렇게했지만 지금은 받아 들일 수 없습니다 (문학적 이유로 그렇게하지 않는 한). (예외 : 일부 사람들은 PS2의 버텍스 쉐이더에 해당하는 안개 값을 계산했습니다. 효과가 훨씬 빨랐지만 모델의 테셀레이션이 필요했습니다. 예를 들어 안개가 길기 때문에 벽이 길지 않았습니다 벽의 구석에서 계산 된 다음 벽의 전체면에 번짐이 생겼습니다. 예를 들어, 벽의 안개 수준 만 테스트했기 때문에 벽이 가운데 바로 옆에 서 있으면 벽이 완전히 안개처럼 보였습니다. 엔드 포인트)
안개 쿼드를 월드에 정적으로 배치하면 (가능한 한 언급 할 수 있음) 제공하는 이미지에서와 같이 매우 부드러운 안개 모양을 얻을 수 없습니다. 뷰어의 방향에 따라 인접한 쿼드. 이러한 겹침은 줄무늬 또는 사다리꼴 (쿼드가 텍스처가없는 경우) 또는 덩어리 (질감이있는 경우)로 나타날 수 있습니다.
그러나 우리는 넓은 화면을 향한 쿼드를 사용하여이지면 안개를 수행하고 평평한지면에서 카메라를 똑바로 보면서이 방법을 사용하여 실제로 부드러운 안개를 만드는 방법에 대한 계산을 수행한다고 가정합시다. 이것이 이상적인 상황입니다. . HD 해상도 : 1920x1080을 가정 해 수평선을 스캔 라인 540으로 설정합니다. 수평선까지 가시성이 있다고 가정합니다 (즉, 수평선에 도달하기 전에 안개가 완전히 불투명 해지지 않는다고 가정). 매끄러운 안개를 얻기 위해 각 스캔 라인에서 하나의 포그 쿼드 시작과 하나의 정지로 (540 * 2 ==) 1080 포그 쿼드가 필요합니다. 이 1080 포그 쿼드 각각은 화면의 전체 수평 확장을 커버합니다.
낮은 값을 추정하고 평균적으로 안개면이 약 300 행의 픽셀을 포함한다고 가정 해 봅시다. 가장 가까운 것들은 덜 덮을 것이고, 가장 먼 것들은 덜 덮을 것이고, 가운데 줄은 훨씬 더 많이 덮을 것입니다.
이 추정값으로, 평균 포그 쿼드에 의해 19206,000 픽셀 (576,000 픽셀)이 닿습니다. 전체적으로 (576,000 * 1080 ==) 622,080,000 픽셀은 전체 "반투명 한 지오메트리 렌더링을 통한 부드러운 안개"효과 전체에 대해 터치됩니다. 그리고 그 숫자는 더 높은 해상도로 달리는 사람들에게 올 것입니다. 더욱이, 우리는 z- 버퍼에 대해 동일한 수의 테스트와 거의 동일한 수의 픽셀 블렌드 작업을 얻습니다.이 모든 투명 레이어는 서로 반복해서 그려지기 때문입니다. 그것은 많은 픽셀입니다.
그리고 이것이 가장 좋은 시나리오입니다. 사용자가 내려다 보거나 웅크 리고 있으면 포그 쿼드의 스크린 범위가 훨씬 넓어집니다.
1080 쿼드가 겹치므로 각각에 대해 (1.0 / 1080 ~ =) 0.0009의 알파 값을 설정해야합니다. 따라서 1080 쿼드를 모두 살펴보면 안개가 완전히 불투명 해집니다. (우리는 그보다 더 높을 수 있지만 가능한 범위를 넓히고 싶다고 가정하는 값입니다). 이 값은 32 비트 색상 값 (256 * 0.0009 ~ = 0.237의 알파 구성 요소로 표시 할 수 없으므로 시도하면 0으로 내림됩니다). 이것이 작동하려면 0.0009 값을 부동 소수점 값으로 OpenGL에 제공해야합니다. (또한 실제로 동일한 값을 설정하고 싶지는 않습니다. 우리는 부드러운 안개를 내기 위해 수평선 아래의 각 스캔 라인에서 하나의 쿼드를 시작하고 하나의 마무리를 원한다고 정의했습니다.
또한 현대 셰이더에서와 같이이 방법을 사용하면 포그 블렌드가 제대로 작동하지 않습니다. "이 백분율을 사용하여 기본 오브젝트 색상과 포그 색상 간 블렌드"를 계산하는 대신 1080을 얻습니다. "지금까지의 색상과 안개 색상 사이의 안개 비율을 안개 비율로 혼합"의 계산. 즉, 안개가 대수 감소 후 물체에 영향을 미칩니다. 즉, 첫 번째 포그 쿼드가 블렌딩 작업에 더 많은 영향을 미치기 때문에 20 개의 포그 쿼드에 영향을받는 객체는 10 개의 포그 쿼드에 의해 영향을받는 물체보다 두 배 미만의 안개로 표시됩니다.
: 이는 모든 말을하는 것입니다 단지 조각 쉐이더를 사용하십시오.
아뇨 구현하기가 더 간단하고 저렴하고 빠르며 빠르며 오류가 적으며 실제로 게임을 다시 만들 수 있으며 가능한 모든 방법이 더 좋습니다. 당시에 모호한 것이 가능하다면 PS2 시대에 완전히 해냈을 것입니다.