자세한 텍스처를 렌더링하는 데 시간이 더 걸립니까?


22

정사각형을 렌더링하려고한다고 가정하겠습니다. 텍스처는 "square.png"입니다.

텍스처가 단순한 색상 일 경우 컴퓨터에서 더 쉽게 렌더링 할 수 있습니까?

그리고 여기저기서 완전히 임의의 색을 가진 매우 시끄러운 질감이라면 어떨까요?

또는 텍스처의 모든 픽셀이 서로 다르지만 약간만 다르다는 점에서 텍스처가 시끄럽다면?

답변:


39

게임 개발, 특히 게임 그래픽에서 대부분의 것들과 마찬가지로 대답은 "의존적"입니다

질감 크기

텍스처의 해상도는 렌더링 속도에 영향을 줄 수 있습니다. 픽셀이 많을수록 GPU에 업로드 할 원시 데이터가 많고 한 번에 캐시에 맞출 수있는 텍스처가 적으므로 텍스처의 오른쪽 부분을 기다리는 동안 셰이더가 더 많은 일시 정지를 칠 수 있습니다 캐시로 가져옵니다.

밉 매핑을 사용하면 이로 인한 영향을 줄일 수 있습니다. 밉맵을 사용하면 축소 된 버전의 텍스처 체인을 저장합니다. 처음에는 더 많은 메모리가 소리를냅니다. 그러나 텍스쳐가 화면에 작은 크기로 표시 될 때 (원거리의 원거리 오브젝트와 같이) 더 작은 버전에서 읽을 수 있으므로 샘플이 전체적으로 점프하지 않고 텍스처 캐시를 더 잘 사용합니다. 또한 앨리어싱이 줄어 듭니다.

텍스처 디테일

텍스처의 내용은 대부분 렌더링 효율성에 영향을 미치지 않습니다.

색상은 GPU에 관한 한 많은 숫자이므로 그 숫자가 무엇이든 상관하지 않으며 수학을 통해 같은 방식으로 퍼널 링합니다. "이전에 녹색에서 픽셀을 본 적이 있는데, 마지막에이 입력을 보았을 때 계산 한 것과 동일한 출력을 재사용 할 것입니다"라는 것을 기억하는 것만 큼 멋진 일은하지 않습니다. 또는 임의의 반짝임, GPU가 동일한 작업을 수행하고 있습니다.

이미지의 예측 가능한 영역에서보다 효율적으로 압축하고 복잡한 영역에서 더 많은 비트를 소비하는 PNG 및 JPG와 같은 형식과 달리 BTC, ETC, PVRTC 또는 원시 RGBA와 같은 GPU 텍스처 형식은 블록 당 고정 된 수의 비트를 사용합니다. 픽셀. 따라서 동일한 압축 형식을 유지하면서 텍스처를 더 자세하게 또는 덜 상세하게 만들면 데이터 크기가 변경되거나 데이터 전송 및 캐시 관련 효율성에 영향을 미치지 않습니다.

그러나 이전 압축에서 잘 보존되지 않은 특정 종류의 세부 정보를 사용하는 경우 다른 형식을 사용하도록 전체 이미지를 변경해야하므로 데이터 크기가 다시 변경 될 수 있습니다.

셰이더 분기 및 간접

상황에서 가장 큰 별표는 다음과 같습니다.이 텍스처 색상 입력을 사용하여 if()분기 와 같은 결정을 내릴 수 있습니다 . 여기서 세부 사항은 속도에 중요합니다.

GPU 음영 처리 단위는 일괄 처리로 픽셀 블록에서 작동하며 여러 데이터 스트림에서 동일한 명령을 병렬로 실행합니다. 따라서 블록의 일부 픽셀이 하나의 분기를 가져 if오고 다른 픽셀이 다른 분기를 가져갈 때 전체 배치는 분기 를 모두 거쳐야 합니다 (한 픽셀 세트 또는 다른 세트에 적용되지 않는 결과를 가리십시오)

입력이 매끄럽고 예측 가능한 방식으로 변경되면 단일 브랜치 만 필요로하는 많은 블록이있을 수 있으며 이러한 두 브랜치 케이스 모두 전환 경계 주위의 좁은 대역으로 제한됩니다. 그러나 입력이 임의적 인 경우 대부분의 블록이 두 가지를 모두 취하여 렌더링 속도를 늦추기를 기대합니다.

왜곡 또는 인덱스 맵과 같이 하나의 텍스처를 사용하여 두 번째 텍스처에 대한 조회를 제어하는 ​​경우에도 발생할 수 있습니다. 첫 번째 텍스처가 무작위로 튀어 나오면 두 번째 텍스처의 흩어져있는 임의의 작은 지점에서 샘플링하여 텍스처 캐시의 일관성이 떨어지고 평균적으로 필요한 데이터를 얻기 위해 더 오래 기다립니다.


따라서 전반적으로 : 아닙니다. 텍스처의 내용은 렌더링 속도에 큰 영향을 미치지 않습니다. ;)


저해상도 텍스처 (Minecraft 생각)는 특정 텍셀이 캐시에로드 될 때 인접한 픽셀에 대한 텍셀을 캐시에로드 할 가능성이 더 높습니다.
user253751

6
@immibis Minecraft는 작은 질감을 가지고 있습니다. 기본값은 16x16입니다. 각 코어의 텍스처 캐시에 너무 쉽게 들어 맞지 않아 재미 있지도 않습니다. 화면 분할을 고려하면 특히 그렇습니다. 합리적으로 가까운 경우 주어진 코어의 전체 배치가 동일한 텍셀에 매핑 될 수 있습니다. Minecraft에 도움이되지 않는 최적화에 많은 노력이 낭비됩니다.
Luaan

1
참고 : "픽셀 당 동일한 수의 바이트를 사용"은 실제로 그래픽 코드가 사용하는 일부 속도 해킹의 핵심입니다. 내부적으로 PNG를 사용하거나 가변 픽셀 크기의 UTF-8과 같은 것을 사용하려고 시도하는 경우 nth 픽셀에 도달하기 전에 모든 단일 픽셀을 거쳐야합니다. 일정한 픽셀 바이트 너비로, 그것은 단지 start_of_buffer + width * n이며 , 특히 큰 경우에 훨씬 빠릅니다 n.
기금 모니카의 소송

@Luaan 나는 블록에서 멀리 떨어져 있더라도 하나의 텍셀을 가져올 때 (둘 중 어느 쪽이든) 캐시에 인접한 것들을 가져와야 함을 의미합니다.
user253751

4
그것이 밉 매핑으로 위에서 이야기 한 경우입니다. 캐시 재사용이 거의 없거나 전혀없는 사이에 큰 차이를 남기지 않고 텍스처 주변에서 샘플을 건너 뛰지 않도록 512x512 버전과 256x256 버전을 저장하고 때로는 1x1까지 내려갑니다. 따라서 16x16에서 1024x1024 텍스처를 그릴 때 대부분의 게임은 실제로 16x16 밉에서 읽게되며 캐시 효율성 측면에서 16x16 Minecraft의 경우와 비슷합니다. 또한 다운 샘플링에서 반짝이는 앨리어싱 가공물이 줄어 듭니다.
DMGregory

1

의 DMGregory의 탁월한 대답 과 함께 , "텍스처"의 복잡성이 렌더링 성능에 영향을 미칠 수있는 경우가 있으며, 이전 렌더링의 결과가 후속 렌더링에서 소스로 사용되는 경우가 있습니다 (예 : 그림자 맵). / 반사 / 환경지도.

일부 최신 하드웨어는 이러한 버퍼에 무손실 압축을 적용 할 수 있습니다. 예를 들어 PowerVR에는 PVRIC , AMD, Delta Color Compression , ARM에는 비슷한 것이 있습니다. 이러한 압축 기술의 목적은 전반적인 대역폭을 줄이고 렌더링 성능을 향상시키는 것입니다.

깊이 나 색상 (정수 또는 부동 소수점)과 같이 데이터가 단순할수록 이러한 체계가 더 잘 작동합니다. 물론, 렌더링 출력을 의도적으로 단순화하여 더 나은 기능을 제공하는 것은 아니지만 노이즈가 많은 데이터를 사용하지 않는 것이 어떤 상황에서는 도움이 될 수 있습니다.

또한 대역폭을 낮추려는 시도로 이러한 체계를 사용하는 프레임 / 깊이 버퍼의 스파 스 샘플링을 수행하는 것은 블록 기반 일 가능성이 높기 때문에 도움이되지 않습니다.

또한 다음 두 SE Computer Graphics 질문과 답변을 찾을 수 있습니다.

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