Loading...
2016. 6. 13. 00:46

Depth and Normal Texture (Part 2)

이전 글 : Depth and Normal Texture (Part 1)원문 : Depth and Normal Texture (Part 2) 이 글은 이전 글에 연속되는 글이다.이 글은 총 세개의 글로 이루어져 있고 depth 와 normal 텍스쳐들을 다룬다. Depth Texture 작업이제 우리는 어떻게 깊이텍스처를 얻는지 배웠고, 그 값을 흑백 이미지로 출력했으니,이걸로 좀 더 재미있는걸 해 보자.Quanturm Conundrum의 차원 이동 효과에서 환경을 거쳐가는 빛의 링을 간단한 버전으로 만들어 볼 예정이다.어디서든 내가 바라보는곳의 중간지점에서 시작하는 것 대신에 내가 볼 수 있는가장 먼 곳에서 시작해서 연속적으로 증가해서 카메라를 지나가게 만들거다.추가로, 링이 오브젝트들을 지나가면 살짝..

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..

2016. 4. 29. 20:24

Unity에서 Depth Texture의 사용

1. 깊이값 : 뷰 공간에서 원점(카메라 위치)와 정점간의 거리v2f vert (appdata_base v) {v2f o;o.pos = mul (UNITY_MATRIX_MVP, v.vertex);// x is 1.0 (or –1.0 if currently rendering with a flipped projection matrix), // y is the camera’s near plane, z is the camera’s far plane and w is 1/FarPlane.o.depth = length(mul(UNITY_MATRIX_MV, v.vertex))* _ProjectionParams.w;return o;}half4 frag(v2f i) : SV_Target {return fixed4(i.de..

2016. 4. 29. 11:28

Depth and Normal Texture (Part 1)

이 글은 번역글 이다.원본 : http://williamchyr.com/2013/11/unity-shaders-depth-and-normal-textures/ 나는 지난 삼일을 유니티 셰이더를 배우는데 보냈다.많은 양의 기본 문서들을 보는 것은 그다지 어려운 일이 아니었다.하지만 깊이 버퍼(depth buffer)까지 왔을 때, 후처리 (post process)의특별한 효과에 무척 효율적이지만, 정보가 절대적으로 부족하며, 유니티의 문서가 크게 도움이 되지 않았다.예를들자면, 만약 어떻게 깊이 텍스처와 노멀 텍스처가 사용되어지는지알려고 해도 유니티 문서의 조언은 "대체 셰이더 예제 프로젝트의 외곽검출이나SSAO 효과에 사용되어진다."라고만 되어 있다.이는 셰이더를 잘 파악하고 있는 누군가에게는 충분한 내..

#pragma multi_compile

가끔 고정된 셰이더 코드를 만들고 거기에 약간 다른 "variant" 셰이더 를 만드는게 편하다.보통 이는 "mega shaders" 또는 "uber shaders"라고 불리며, 각 상황에 따라다른 처리기 지시문과 셰이더 코드를 여러번 컴파일 해서 만들어졌다.유니티에서는 그냥 #pragma multi_compile 또는 #pragma shader_feature 지시문을 shader snippet에 추가하여 만들수 있다.이는 surface shader에서도 가능하다. 런타임에 적절한 셰이더 variant는 material 키워드(Material.EnableKeyword / DisableKeyward) 또는 global shader keyword(Shader.enableKeyword / DisableKeyw..

SV_POSITION과 POSITION

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

Performance Tips when Writing Shaders

float : 32비트, 높은 정밀도 half : 16비트, 중간 정밀도, -6000 ~ 6000 fixed : 11비트, -2.0 ~ 2.0, 그리고 1/256. color 와 벡터 길이 fixed를 쓰셈 그리고 적당히 half를 쓰고 더 높은 정밀도가 필요하면 float를 쓰셈. 참고 링크- Cg Programming/Vector and Matrix Operations- Performance Tips when Writing Shader-