본문으로 바로가기

Unity OpenGL Core Details

category Technical Report/Unity Shader 2017. 1. 23. 16:23
반응형


원문링크 : https://docs.unity3d.com/Manual/OpenGLCoreDetails.html


OpenGL Core Details.


유니티는 기본으로 DX11 혹은 DX9으로 화면이 렌더링 되나 이를 OpenGL로 렌더링을 변경할 수 있다. 그러나 Apple은 OS X 데스크톱의 OpenGL 버전을 최대 4.1로 제한하므로 Unordered Access Views 또는 Compute Shaders와 같은 모든 DirectX 11 기능을 지원하지는 않는다. 즉, 셰이더 레벨 5.0 (#pragma target 5.0)을 목표로 설정한 모든 셰이더는 OS X에서 동작하지 않는다.


새로운 OpenGL 백엔드는 많은 새로운 기능을 도입되었다(이전에는 대부분 DX11 / GLES3에만 해당).

 - Compute shaders (ComputeBuffers 및 "random write" 렌더 텍스처)
 - 테셀레이션 및 지오메트리 셰이더
 - 간접 draw (Graphics.DrawProcedural 및 Graphics.DrawProceduralIndirect)
 - 고급 블렌드 모드



셰이더 변경사항

기존 #pragma 대상을 사용하는 경우 다음과 같은 GL 수준에 매핑됩니다.

     #pragma target 4.0 // OpenGL ES 3.1, 데스크톱 OpenGL 3.x, DX Shader Model 4.0


     #pragma target gl4.1 // Desktop OpenGL 4.1, SM 4.0 + tessellation to match MacOSX 10.9 capabilities


  
   #pragma target 5.0 // OpenGL ES 3.1 + Android Extension Pack, desktop OpenGL >= 4.2, DX Shader Model 5.0


특정 플랫폼에서 해당 셰이더를 사용하거나 사용하지 못하도록 하려면 #pragma only_renderers / exclude_renderers 플랫폼을 지정하면 됨(이전 셰이더 문법과 동일)

    #pragma only_renderers glcore : 데스크탑 GL 용으로 만 컴파일. ES 3 타겟과 마찬가지로, 이것은 기본 데스크탑 쉐이더가 GL 2.x를 지원하고 SM5.0 기능이 필요한 쉐이더가 OpenGL 4.2+를 필요로하는 모든 데스크탑 GL 버전을 포함하도록 확장.


OpenGL core profile command line arguments

 

 유니티는 기본으로 Direct X 기반으로 화면이 렌더링 된다. 이를 타겟 플랫폼(모바일이나 콘솔등등)에 맞추어 화면에 렌더링 하는 옵션을 줘서 실행하는 것이다.


 PC나 콘솔의 경우 기본으로 실행되는 DX기반으로 실행해도 무방하나(테셀레이션이나 기타 DX11전용 셰이더를 사용하면 DX11 고정으로 실행하는걸 추천) 모바일의 경우 OpenGL ES(GLSL Embedded System) 모드로 실행하는 것을 권장한다. 모바일 VR의 경우 최저사양인 노트5나 갤럭시 S6의 경우 ES 3.1로 렌더해서 확인하는것이 좋다.



이게 미묘하게 색감이나 느낌차이가 있다...

OpenGL 기반의 PS와 Direct X기반의 XBOX의 경우, PS3랑 XBOX360도 그래서 색감 차이가 살짝 난다. 같은 빌드 올려도..;;;.


주 : PS3 : PSGL- OpenGL ES 1.1과 nvidia CG기반의 api, PS4 : low level GNM, hight level GNMX 2개의 graphics api. PlayStation Shader Language는 DX11기반의 HLSL 코드와 매우 유사)

더 자세한 내용은 링크 참조 : https://en.wikipedia.org/wiki/PlayStation_4_system_software



바탕화면에 단축아이콘을 만들고 마우스 우클릭 편집으로 실행 경로 뒤에 아래 선언자를 넣어주면 목적에 맞게 유니티가 렌더링 된다(이거 정리를 한거 같은데 포스팅이 안보여서 다시 작성...;;;)


  -force-opengl : legacy OpenGL. 화면을 openGL로 렌더링


  -force-glcore : 새로운 OpenGL 백엔드를 사용. Unity는 가능한 최상의 OpenGL 버전과 사용 가능한 모든 OpenGL 확장을 사용하여 플랫폼이 지원하는 모든 기능을 감지하여 렌더링


  -force-glcoreXY : XY는 32, 33, 40, 41, 42, 43, 44 또는 45. 각 숫자는 OpenGL의 특정 버전을 지칭. 플랫폼이 OpenGL의 특정 버전을 지원하지 않으면 Unity는 지원되는 버전으로 대체.

 
-force-gles : OpenGL ES 모드에서 새로운 OpenGL 백엔드를 사용.
가능한 최상의 OpenGL ES 버전 및 사용 가능한 모든 OpenGL ES 확장을 사용하여 플랫폼이 지원하도록 지원하는 모든 기능을 감지.(그냥 OpenGL ES 렌더링 모드라 생각하면 됨)


 -force-glesXY : XY는 20, 30, 31 또는 31aep. 각 숫자는 OpenGL ES의 특정 버전을 나타냄. ES 2.0과 3.0 그리고 3.1까지 나누어서 테스트 해야 하는 경우가 많기 때문에 특정 타겟 디바이스를 선택할때에 이를 넣어준다

 -force-clamped : Unity가 여러 플랫폼이 동일한 코드 경로를 실행하도록하는 OpenGL 확장을 사용하지 않도록 요청. 이것은 플랫폼 관련 문제인지 테스트하는 접근법(예 : 드라이버 버그).


반응형