본문 바로가기
커스텀 셰이더 GUI 만들기 - 기본 시작 셰이더의 인터페이스를 커스텀 해봅시다 우선 제일 먼저 해볼 일은, 기본형 ... 즉 '아무것도 없는 빈 기본형'을 만드는 것입니다 빈 기본형 만들기 셰이더 그래프를 하나 만듭시다 그리고 평범하게 3개의 Properties를 추가했습니다. 각각 float , Texture, color 네 평범하죠 그리고 메터리얼을 생성하고, 방금 만든 셰이더를 연결합니다. 메터리얼을 확인하면, 방금 만든 Properties 가 활성화 되어 있는 것을 확인할 수 있습니다. 잘 들어와 있군요. 저걸 다 지워볼께요 . 커스텀 GUI 코드로! C# 스크립트를 하나 생성합니다. 아참. 스크립트는 반드시 Editor 폴더에다가 만들어야 합니다. 그리고 Custom Editor GUI 에다가 그 C# 스크립트 이름을 맞춰서 적습니다... 2021. 5. 2.
URP Shader 에서 Set Material Keyword 찾기 URP 셰이더들에 보면 메터리얼 키워드들이 정의되어 있는데, 이걸 활성화 시켜주는 부분을 찾을 수가 없다. // Material Keywords #pragma shader_feature_local_fragment _ALPHATEST_ON #pragma shader_feature_local_fragment _ALPHAPREMULTIPLY_ON #pragma shader_feature_local_fragment _ _SPECGLOSSMAP _SPECULAR_COLOR #pragma shader_feature_local_fragment _GLOSSINESS_FROM_BASE_ALPHA #pragma shader_feature_local _NORMALMAP #pragma shader_feature_local_f.. 2021. 4. 27.
InputData input.hlsl에 정의되어 있음. struct InputData { float3 positionWS; half3 normalWS; half3 viewDirectionWS; float4 shadowCoord; half fogCoord; half3 vertexLighting; half3 bakedGI; float2 normalizedScreenSpaceUV; half4 shadowMask; }; SurfaceData.hlsl struct SurfaceData { half3 albedo; half3 specular; half metallic; half smoothness; half3 normalTS; half3 emission; half occlusion; half alpha; half clearCoatM.. 2021. 4. 13.
#ifndef 이게 뭘까 URP 셰이더를 보다보면 인클루드 파일에 #ifndef UNIVERSAL_SIMPLE_LIT_INPUT_INCLUDED #define UNIVERSAL_SIMPLE_LIT_INPUT_INCLUDED #endif 이런 류의 항목을 볼 수 있다. 검색해 봐도 따로 선언된 곳도 없고 , 어디다 쓰는걸까 라는 생각이 든다. 이것은 중복 인클루드를 막는 거라고 생각해도 좋을듯. 아무래도 URP 셰이더는 인클루드로 서로 막 꼬여 있기 때문에, 인클루드에 인클루드가 들어갈 수도 있다고 생각하는게 편하다. 그럴때 이걸 선언해서, 중복 인클루드해도 문제가 없도록 선언해 주는 것이라고 보는게 좋겠다. pchero21.com/?p=911 헤더파일 속의 #ifndef와 #endif 선언 헤더파일을 보면 다음과 같이 #ifnd.. 2021. 4. 8.
URP 2019 에서 2020으로 업그레이드 할 때 Shader Error URP 2019 에서 2020으로 업그레이드 할 때 Shader Error URP 7 에서 10으로 업그레이드 할 때 Shader Error가 나는 경우가 있습니다. 노드로 짜면야 문제가 없지만 코드를 짰을 때, 그것도 기존 내장 인클루드를 같이 이용했을 때 말이죠. 'InitializeInputData': output parameter 'inputData' not completely initialized at .. 이 에러는 Core.hlsl에 인클루드 되어 있는 Input.hlsl을 사용했을때 나오는 에러인데요 아니 코어를 만들어 쓸 리가 없잖 이 인풋이 아래처럼 바뀌었습니다. 뒤에 두 줄이 추가되었어요. 이게 초기화가 안되어 있다고 나는 에러입니다. 코드를 보아하니 URP에 아직 안 들어가 있었던 .. 2021. 3. 24.
Normal Blending (Detail map) Normal을 Blending 하는데 그냥 쉽게 더해서 나누는 것만으로 해결되지 않는듯. 노말 블렌딩 공식이야 정형화되어 있지 않다고 하지만 일단 유니티에 있는 것을 따라하고 해석하는게 먼저일듯 하다 생각해 보면 그렇다. 노말을 블렌딩한다고 간단히 생각할 수 있는데, 노말이란게 그냥 칼라가 아니라 기울어진 입체의 방향 아닌가. 이건 즉 '이미 기울어진 면 위에 다시 추가로 기울어진 면을 생성' 하는 것이란 말이다. 즉 A라는 노말맵과 B라는 노말맵을 합칠 때, A와 B가 전환되는 기능을 원한다면 그냥 더한 뒤 나누거나 lerp 해도 문제 없지만, 디테일 맵처럼 A위에 B 를 얹을 때에는, 그냥 lerp 만으로는 A 를 B 가 눌러버리는 현상이 일어나게 된다는 것이다. 이걸 분석해놓은 좋은 블로그가 있다... 2021. 2. 22.
Texcoord. xyzw와 UV1, UV2와의 관계 이 부분이 많이 헷갈리게 작성된 부분입니다. 그래서 정리가 필요하긴 한데요 일단 이걸 설명하려면 먼저 Texcoord 레지스터 부터 알아야 합니다. Texcoord는 기본적으로 텍스쳐 좌표를 옮기기 위해 만들어진 녀석입니다 docs.microsoft.com/en-us/windows/win32/direct3dhlsl/texcoord---ps texcoord - ps - Win32 apps Interprets texture coordinate data (UVW1) as color data (RGBA). docs.microsoft.com 텍스쳐 좌표계는 아시는대로 주로 UV, 즉 float2 를 사용합니다만 사실 UVW 라고 하는 3차원 좌표계도 있다는 것을 알고 계실 겁니다. 그렇게 되면 float3 지요... 2021. 2. 11.
돋보기 효과 만들기 기본적으로 스크린 포지션 좌표로, 씬칼라를 그리게 해 놓은 상태입니다. 이러면 화면을 그냥 캡쳐해서 제자리에 그리겠지요. 다음은 화면을 이동시킬 생각입니다. 화면 가운데를 중심으로, 오른쪽 위는 더 오른쪽 위로 ( + ) 왼쪽 아래는 더 왼쪽 아래로( - ) 이런식으로 사방으로 뻗어나가게 해야겠지요 그래서 이렇게 준비를 했습니다. 이건 출발이 UV입니다. 즉 돋보기가 될 스프라이트를 따라서 가겠다는 의미지요. 그리고 UV에 각각 -0.5 를 더해줘서, 가운데가 중심이 되도록 만들었습니다. 이대로 원래 이미지에 연산해주면, 가운데는 영향이 없고 외곽으로 갈 수록 0.5 만큼 밖으로 이동하게 만들 수 있습니다. 일종의 '확대' 가 된 것과 같습니다. 외곽부분에 보면 크게 이동한 것을 볼 수 있습니다. 0.5.. 2021. 2. 11.
Shader.PropertyToID docs.unity3d.com/kr/530/ScriptReference/Shader.PropertyToID.html Unity - 스크립팅 API: Shader.PropertyToID 프로퍼티 식별자들을 사용하것은 모든 메터리얼 프로퍼티 함수에 문자열을 전달하는 것보다 더 효율적입니다. 예를들어 Material.SetColor를 자주 호출하거나, MaterialPropertyBlock 사용하는 경우, 다음 docs.unity3d.com 프로퍼티 이름에서 고유 ID를 가져옵니다. 프로퍼티 식별자들을 사용하것은 모든 메터리얼 프로퍼티 함수에 문자열을 전달하는 것보다 더 효율적입니다. 예를들어 Material.SetColor를 자주 호출하거나, MaterialPropertyBlock 사용하는 경우, 다음은 한.. 2021. 2. 9.
URP Position Transform 이름이 다 바뀌어서 찾기 힘들... float3 positionOS;input.positionWS = TransformObjectToWorld(positionOS);input.positionVS = TransformWorldToView(input.positionWS);input.positionCS = TransformWorldToHClip(input.positionWS); float3 positionOS;input.positionCS = TransformObjectToHClip(positionOS); NDC float4 ndc = input.positionCS * 0.5f;input.positionNDC.xy = float2(ndc.x, ndc.y * _ProjectionParams.x) + ndc.w;.. 2021. 1. 27.
외부 오브젝트의 값을 셰이더에 넘겨주기 셰이더에 변수를 하나 만들고 출력하자 글로벌하게 추적이 가능한듯 이 셰이더를 아래 plane에 넣자. 그리고 위 캡슐 (반쯤 파묻힌) 놈한테는 아래 코드를 넣자 using UnityEngine; [ExecuteInEditMode]public class ShaderInteractor : MonoBehaviour{ // Update is called once per frame void Update() { Shader.SetGlobalVector("_PositionMoving", transform.position); }} 이러면 글로벌하게 저 포지션 값을 찾아서 저 변수에 넣어준다. 셰이더를 지정해줄 필요도 없다. 2021. 1. 27.
GetVertexPositionInputs URP의 셰이더에서 Vetex 메트릭스 연산을 하는 부분은 이렇게 함수로 빠져있다. VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS.xyz ); 이 부분은 Core.hlsl에 정의되어 있다. 순서는 늘 그렇듯. OS(Object Space) -> WS(World Space) -> VS(View Space) -> CS(Clip Space) 로 되어 있고 , 이걸 다시 -1~1 범위인 NDC 좌표계(정규 좌표계)로 변환된다 그 후에 프로젝션 파라미터를 연산하는 것을 볼 수 있다. VertexPositionInputs GetVertexPositionInputs(float3 positionOS) { VertexPosition.. 2020. 12. 14.
반응형