"시저를 이해하기 위해서 시저가 될 필요는 없다." – Max Weber

2014/02/17

셰이더 작성 시 도움이 되는 성능 향상 정보

원문

http://docs.unity3d.com/Manual/SL-ShaderPerformance.html

셰이더 만들면서 이번에 크게 깨달은 게 있어 번역해서 올립니다. 라고 적고 넉 달이나 지나서 올리네요… 흑흑 오역이 있을 수 있습니다 ;ㅁ;

+ 2017.1.18 > 원문 변경에 맞춰 내용 갱신


셰이더 작성 시 도움이 되는 성능 향상 정보

필요한 것만 계산하세요

작성한 셰이더 코드의 추가 계산과 처리가 필요하게 됩니다. 더 추가 하게 되면 게임 성능에 영향을 주게 될 것입니다. 예로 재질마다 색상을 지원하는 건 셰이더를 좀 더 유연하게 만들어서 좋지만, 색상을 항상 흰색으로 놔둔다면 화면에 각각의 버텍스나 픽셀을 그릴 때 쓸모없는 계산을 하게 됩니다.

계산 빈도또한 게임 성능에 영향을 줍니다. 보통 정점(그러니까 정점 셰이더가 실행되는 것)보다 픽셀(픽셀 셰이더가 실행)이 더 많이 렌더되고 물체보다 정점이 더 많이 렌더됩니다. 가능하다면 계산을 픽셀 셰이더에서 꺼내 정점 셰이더에 넣거나 완전히 셰이더 밖으로 옮기고 스크립트에서 값을 한 번만 지정하세요.

표면 셰이더 최적화

표면 셰이더는 조명과 함께 작업할 때 작성하기 좋습니다. 하지만 표면 셰이더의 기본 설정들은 특정 상황에 최적화되기 보다는 폭 넓은 수의 일반적인 상황에 맞춰져 있습니다. 대개 설정을 조정해서 셰이더를 더 빠르게 하거나 적어도 작게는 만들 수 있습니다.

– approxview는 시선 방향을 사용하는 셰이더(즉 정반사)에게 시선 방향을 픽셀 대신 정점마다 정규화하라고 지시합니다. 이는 근사치지만 보통 이것만으로도 충분합니다.

halfasview를 사용한 정반사류의 셰이더가 훨씬 더 빠릅니다. 반 벡터(Half-vector, 조명 방향과 시선 벡터 사이 중간)가 정점마다 계산되고 정규화되며 조명 함수는 시선 벡터 대신 파라미터로 반 벡터를 이미 받고 있을 겁니다.

noforwardadd는 전방 렌더링에서 셰이더가 하나의 방향 조명만 완벽히 지원하게끔 합니다. 나머지 조명들은 정점당 조명이나 구면 조화 조명(spherical harmonics)으로써 계속해서 영향을 줍니다. 이 설정은 셰이더를 작게 만들 때 아주 적합하며 여러 조명이 켜져 있어도 반드시 패스를 항상 한 번만 렌더되게 합니다.

noambient는 주변 광을 사용하지 않게 하며 구면 조화 조명을 사용합니다. 이는 약간 더 빠를 수 있습니다.

계산 정밀도

Cg/HLSL로 셰이더 작성 시 사용하는 세 가지 기본 숫자 자료형으로 float, halffixed(자료형과 정밀도 페이지를 보세요)가 있습니다.

좋은 성능을 위해 가능하다면 항상 가장 낮은 정밀도를 사용하세요. 이는 특히 iOS나 안드로이드와 같은 휴대용 플랫폼에서 중요합니다. 알려진 좋은 지침은 다음과 같습니다.

– 전역(world) 공간 위치나 텍스처 좌표는 float 정밀도를 사용하세요.

– 그외 다른 모든 것(벡터들, HDR 색상들, 등등) half 정밀도로 시작해서 필요할 때만 정밀도를 올립니다.

– 텍스처 자료에 적용하는 아주 간단한 연산들은 fixed 정밀도를 사용하세요.

실제로 정확히 어떤 숫자 자료형을 사용해야 할지는 플랫폼과 GPU에 기반을 둡니다. 대략 요약하자면 다음과 같습니다.

– 모든 현역 데스크톱용 GPU는 모든 것을 항상 최고 float 정밀도로 계산합니다. float/half/fixed 모두 결국에는 똑같이 처리되기 때문에 테스트하기 약간 곤란하게 만듭니다. 그래서 PC에서는 half/fixed로 충분한지 확인하기가 어렵습니다. 그러므로 정확한 결과를 위해 작업한 셰이더는 항상 실제 기기에서 테스트하세요.

– 휴대기기용 GPU는 실제 half 정밀도를 지원하며 이는 보통 더 빠르며 계산하는데 비용이 덜 듭니다.

fixed 정밀도는 보통은 구세대 휴대기기용 GPU에서만 쓸만합니다. (OpenGL ES 3 또는 Metal를 돌릴 수 있는) 대부분의 현역 GPU 내부적으로 fixedhalf를 완전 같게 취급합니다.

더 자세한 내용은 자료형과 정밀도를 보세요.

알파 검사

고정 함수 AlphaTest나 그와 동등한 프로그래밍 가능한 clip()은 여러 플랫폼에서 다른 성능적 특징을 보입니다.

– 일반적으로 대부분 플랫폼에서 투명 픽셀을 완전히 배제(빼버리기)하기 위해 위의 두 함수를 사용하는 것은 약간의 이점이 있습니다.

– 하지만 PowerVR GPU를 장착하고 있는 iOS와 일부 안드로이드 기기상의 알파 검사는 자원 소모가 상당합니다. 이들 플랫폼에서는 성능 최적화를 위해 이를 사용하려 하지 마십시오. 일반적인 경우보다 게임이 느리게 돌아가게끔 합니다.

색상 마스크

일부 플랫폼(주로 휴대기기용 GPU를 사용하는 iOS와 안드로이드 기기)에서 채널 몇 개(예로 ColorMask RGB)를 빼기 위해 색상 마스크를 사용하는 것은  자원 소모가 상당할 수 있습니다. 그러니 정말로 필요할 때만 사용하세요.

댓글 남기기 | cat > 타닥타닥 | tag > , ,

댓글 남기기

* 표시된 곳은 반드시 입력해주세요