AAA 게임의 범위를 벗어남


21

많은 일반적인 AAA 타이틀 (특히 소스 엔진 게임)에서 플레이어가 경계를 벗어 났거나지도 아래에서 클리핑하지 않는 등의 범주가 지정되지 않은 영역에 도달 한 경우 화면에 이상한 효과가 발생합니다 (버퍼 찢기?).

시스템이 멈추는 동안 Windows XP가 드래그되는 창 뒤에 남겨 둘 수있는 창의 흔적과 유사하다고 설명 할 수 있습니다.

화면을 새로 고칠 때 개발자가 색상 버퍼를 지우지 않는다고 가정 할 수 있습니까?

그 맞습니까? 그렇다면 왜 그렇습니까?


8
BTW, 이것을 종종 "거울 거울"효과 또는 HOM이라고합니다.
— Nathan Reed

답변:


35

옛날 옛적에 색상과 깊이 버퍼를 지우는 데 실제로 시간이 걸렸습니다. 명확하게하는 것은 그래픽 카드가 프레임 버퍼의 모든 픽셀을 걸어서 값을 써야한다는 것을 의미했습니다.

이 때문에 게임 개발자는 모든 픽셀을 다시 렌더링한다고 가정하는 것이 더 효율적이라는 것을 알았습니다. 그들은 이것을하기위한 많은 기술을 개발했습니다.

컬러 버퍼는 무시하기 가장 쉬운 방법입니다. 깊이 버퍼는 이전 데이터로 오염되기 때문에 덜 쉽습니다. 그래서 그들이 한 일은 간단했습니다.

프레임 0에서 glDepthRange(또는 D3D와 동등한) (0, 0.5)로 렌더링 하고 glDepthFuncof GL_LESS(또는 GL_LEQUAL)를 사용합니다. 이는 깊이 버퍼에서 얻을 수있는 가장 먼 깊이 값이 0.5임을 의미합니다. 따라서 프레임 0 끝의 깊이 버퍼에서 가장 큰 값은 0.5입니다 (모든 픽셀에 쓴 것으로 가정).

프레임 1에서는 깊이 범위를 (1, 0.5)로 변경합니다. 이 경우 근거리 값이 원거리보다 큽니다 . 그러나 깊이 기능을 GL_GREATER(또는 GL_GEQUAL) 로 변경 하여 깊이 테스트의 의미를 반대로합니다. 깊이 버퍼에서 가장 큰 값은 0.5이므로 작성하는 모든 값이 이보다 큽니다 . 깊이 테스트가 역전되었으므로, 이는 프레임 0에 기록 된 것이 프레임 1에 기록 될 수있는 것보다 멀리 떨어져 있음을 의미합니다. 프레임 1의 끝 에서 깊이 버퍼 의 가장 작은 값은 이제 0.5입니다.

그리고 그들은 반복합니다.

2003 년경 이후로 만들어진 모든 하드웨어에서 이것은 더 이상 최적화가 아닙니다. 실제로, 그것은 부정적인 최적화 입니다. 깊이 버퍼를 지우면 실제로 하드웨어가 더 빨라 집니다. 아뇨

기본적으로 버퍼를 지우면 실제로 아무것도 쓰지 않습니다. 그것들은 GPU의 캐시에 약간의 비트를 저장하여 시스템이 어떤 색 / 깊이를 지웠는 지 알려줍니다. 시스템이 프레임 버퍼의 캐시 라인에 쓰려고 할 때, 그것이 명확한 색 / 깊이 값의 빈 필드임을 이미 알고 있기 때문에 거기에있는 것을 읽는 것을 귀찮게하지 않습니다. 존재하는 것과 혼합하거나 깊이 테스트를 다시 시도하면 다시 읽을 필요가 없습니다. 혼합 / 테스트와 함께 /에 대해 어떤 가치가 있는지 알고 있습니다.

따라서 삭제 후 각 캐시 라인에서 수행하는 모든 첫 번째 읽기 / 수정 / 쓰기는 기본적으로 쓰기입니다. 그것은이다 무료 .

또한 들쭉날쭉 한 깊이 버퍼를 사용하면 하드웨어의 Hyper-Z / Hierarchial-Z / Z- 컬링 최적화에 맞출 수 있습니다. 그렇습니다. 디테일을 추가하면 장면이 결국 장면과 맞 닿게됩니다. 그러나 뎁스 버퍼가 이전 렌더링에서 들쭉날쭉하면 배경 객체가 배경에 있어도 Z- 컬링 기술의 효율성에 영향을 줄 수 있습니다. 그리고 그것은 성능을 향상시키지 않을 것입니다.

따라서 현대 게임에서이 깊이 반전 기술 을 사용해서는 안됩니다 .

참고 : Jari는 (대부분의 모바일 플랫폼에서 볼 수있는) 타일 기반 렌더링 아키텍처를 잘 보여줍니다. 깊이를 지우지 않으면 불쾌감을 줄 수 있습니다.


마지막 진술은 깊이 버퍼를 번갈아 바꾸지 않는다는 것을 의미합니까? 좋은 대답입니다.
— 감속

1
@ 다니엘 예. 내 게시물을 명확하게했습니다.
— Nicol Bolas

3
또한 대부분의 OpenGL ES 칩과 같은 비닝 아키텍처에서 명확한 건너 뛰기 를 사용하면 그래픽 칩이 컬러 버퍼 상태를 가정 할 수 없으므로 성능 이 크게 저하됩니다.
— Jari Komppa

5

예, 백 버퍼가 지워지지 않은 것이 맞습니다.

이유는 (주로) 각 프레임의 반대 방향으로 깊이 값을 핑퐁하는 커스텀 셰이더를 사용하는 것이 더 빠르기 때문에 게임이 항상 화면의 모든 픽셀을 렌더링한다는 사실에 의존합니다.

따라서 비용이 들지 않으면 프레임 당 하나의 버퍼 공간을 절약 할 수 있습니다.


1
나는 깊이 탁구에 대해 모른다. 내가 익숙한 모든 엔진은 각 프레임마다 깊이 / 스텐실 버퍼를 지 웁니다. 그러나 그 외에도 게임이 모든 픽셀을 렌더링 해야하는 경우 색상 버퍼를 지우지 않아도됩니다.
— Nathan Reed

쉐이더에 대한 예를 들어 주시겠습니까? 그렇지 않으면 좋은 대답입니다.
— 감속

1
@NathanReed의 의견을 읽고 최신 엔진에 대해 묻는다는 것을 알고 있습니다. 현재 PC 전용 엔진 수는 몇 개입니까? Z 버퍼 트위스트는 오래된 기술이므로 참조를 찾을 수 있는지 살펴 보겠습니다. 콘솔 엔진은 대부분 모든 컬러 버퍼를 지우고, Nathan이라는 HOM 효과를 보여주는 하나의 픽셀조차도 타이틀에 실패하고 다시 제출을하게됩니다.
— Patrick Hughes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.