Loading...
2017. 1. 16. 13:17

Optimizing Shader Load Time

필요에 의해 모자란 실력으로 번역하였습니다.원문을 참고하시길 권해드립니다. 원문에 대한 링크는 아래 Reference Link에 있습니다. 셰이더 로드 시간 최적화.셰이더는 GPU에서 실행되는 작은 프로그램이며, 로딩하는데 시간이 좀 걸린다.각 개별 GPU 프로그램은 전형적으로 로드하는데 많은 시간이 필요하지 않지만셰이더는 내부적으로 많은 "변형"을 가지고 있다.예를 들어 Standard Shader의 경우, 완전히 컴파일 되면, 조금씩 다른 수천개의GPU 프로그램이 되는데 이는 두가지 잠재적 문제를 만든다.1. 셰이더 변형이 많으면 게임 구축시간과 게임 데이터 사이즈가 증가한다.2. 많은 수의 셰이더 변형을 로딩하는 동안 게임은 느려지고 메모리는 증가한다. Shader build time strippi..

특정 android mobile chipset에서 half 문제

half 관련 문제는 intel만 있는줄 알았는데... 문제를 일으킨 핸드폰은 아래와 같다.핸드폰 이름 : G3모델 번호 : LG-F400KAndroid 버전 : 6.0GPU : Adreno TM 330 문제를 일으키지 않은 핸드폰 1.핸드폰 이름 : G Pro모델 번호 : LG-F240LAndroid 버전 : 4.4.2GPU : Adreno TM 320 2. 핸드폰 이름 : SN-N900L, 삼성 갤럭시 노트3모델 번호 : SN-N900LAndroid 버전 : 5.0GPU : Adreno TM 330 문제가 발생했던 코드는 아래와 같다.float2 coord = i.uv.xy;half4 color = tex2D(_MainTex, coord);half3 b0 = tex2D(_Bloom0, coord).r..

shader tip with Intel

이전에 포스팅한 테그라에서의 유니티 버그는 대략 마무리 되었고이번에는 듀얼 os를 지원하는 태블릿들 테스트중..그런데 특정 셰이더 쓰는 애들은 mask가 안된다.머징 이생퀴들은... 에러도 딱히 안났는디...크흠크흠..구글신이 말하길.. Intel은 Half Float 지원안한단다... 아래 내용을 조금 해석해 보자면...half float 이나 float 자료형은 몇가지 응용프로그램 영역에서 인기있는 유형이다.half float 타입을 저장유형으로 간주하기 때문에 종종 데이터를 half type으로 저장하더라도,계산은 이러한 유형의 값에서 수행되지 않는다.일반적으로 어느 계산을 하기전에 32비트 float 타입으로 값을 변환시킨다. half float 타입의 지원은 단지 32비트 float으로, 또는 ..

unity bug with tegra k1

미루고 미루었던 비주류 제품들 빌드 테스트를 하기 시작함.1. tegra2. 듀얼 os 테블릿 pc 제품들. (뭔가 칩셋이 제각각임) 기본적으로 이전에 언렬에서 겪었던 말리칩의 float 정밀도 문제이후웬만하면 모든 칩셋에서 테스트를 해볼려고 노력중이다. 그래서 이번에 마침 테스트패드로 가지고 있던 샤오미 미패드1과 2로 테스트.미패드1은 tegra k1, 미패드2는 Intel HD Graphics이다. tegra k1으로 테스트를 하는데 전투를 시작하면 백프로 뻗음.뭘까? 이전 빌드때도 뻗어서 그때는 유니티 내장셰이더를 쓰지 않고자체 셰이더를 썻더니되서 혹시 이번에도 그런 문젠가 해서셰이더를 문제없이 출력되는 셰이더를 넣고 해봄. 뻗음..... 왜 뻗는지 몰라서 패치받는 절차도 귀찮고 해서 로그인에 뻗..

2016. 5. 12. 18:31

unity material parameter 변경

케릭터 같은거는 그냥 mesh의 renderer을 얻어 renderer.material.set~~ 이렇게 해주면 언렬의 인스턴스 머티리얼처럼 쓸수 있었는데 Unity material은 그렇게 되지 않는다.하나를 바꾸면 전체가 다 바뀐다. 마치 shader material처럼.타고 들어가 보니 materialForRendering 라는게 있다. 오오~!! 역시 있었어~!! 하면서 써봤는데 안됨...ㅡㅡ;..날로먹을수 있을줄 알았는데...구글느님에게 물어봤더니 역시 나처럼 삽질한 사람이 있음.이 링크를 보면 원본 material을 그냥 Instantiate 시켜서 인스턴스를 만들고그걸 다시 링크를 시켜서 사용한다. Material mat = Instantiate(image.material); mat.SetF..

ngui uitexture shader update

uitexture의 머티리얼에 setfloat(...)을 해 줘도 제대로 갱신이 안된다.분명 update()함수에서 해 줬는데도 안됨. void Update(){ offset += Time.deltaTime * 0.005f; material.SetFloat("_Distance", offset);} 값이 설정은 되는데 왜 안되는지 모르곘다. 그래서 좀 검색을 해 봤더니 dynamicMaterial 이라는 것을 써야 한다는 것을 알게되었다.주석을 보면 이 dynamicMaterial 이라는 놈은 "실제 지오메트리를 그리기 위해 draw call에서 동적으로 생성해서 사용되어지는 머티리얼"이라고 적혀있다. Instantiated material 이라고 적혀 있는데 언리얼에서 제공하는 instance mater..

SV_POSITION과 POSITION

예제를 보다 보니 vertex input 구조에는 POSITION 시멘틱을 사용하는데 픽셀 셰이더로 넘기는vertex output 구조에는 거의 SV_POSITION을 쓴다.그냥 그러려니 하며 넘기다가 급 관심이 생겨서 좀 찾아봄. 우선 SV_~~ 에서 sv는 system value 의 뜻이고 아래 링크 내용을 대략 요약하자면.dx에서 먼저 이러한 api를 만들었고 sv_가 붙은 시멘틱은 시스템적으로 추가 기능이 있다.dx9에서 dx10으로 넘어가면서 shader 단에서 시스템적으로 추가 처리를 하는 시멘틱이 필요해서만들어 졌고 멀티플랫폼을 지원하기 위해 다른 언어(예를 들자면 cg?)에서도 hlsl 변환시필요한 sv_가 필요해졌다. 뭔가 깔끔한 설명을 못 찾아서 좀 슬프지만 아래 두 링크가 어느정도 궁..