HDRP에서 가벼운 셰이더를 제작중입니다.

저사양 컴을 위해서 CustomLight를 만들어서 셰이더를 가볍게 만들 생각입니다.

URP는 CustomLight를 만드는 자료가 많이 있는데, HDRP는 찾을수가 없었습니다.

어찌어찌 찾고 찾아서... 방법을 알아 낸거 같군요.

 

URP

#ifdef SHADERGRAPH_PREVIEW
Direction = float3(1, 1, 1);
#else
Light light = GetMainLight();
Direction = light.direction;
#endif

 

HDRP 

#ifdef SHADERGRAPH_PREVIEW
Direction = float3(1, 1, 1);
#else
DirectionalLightData lightData = _DirectionalLightDatas[0];
Direction = -lightData.forward;
#endif

'업무일지' 카테고리의 다른 글

업무일지 <배경추가>  (0) 2023.06.09
업무일지 <Shader Changer>  (0) 2023.05.25
업무일지 <Frame>  (0) 2023.05.22
업무일지 <연출 작업>  (0) 2023.05.18
업무일지 <Unlit Shader>  (0) 2023.05.16

 

어떠한 이유에서 게임을 빌드했는데, 비정상적으로 셰이더가 나올때 사용하면 좋은 기능입니다.

 

Shader variant collection은  shader가 빌드가 되었을때 정상적으로 보이게 보장되도록 shader를 확정해주는 기능입니다.

유니티 원문에는 이기능은 scene을 로드하기만해도 자동으로 수집되기 때문에 shadervariant 파일이 있기만 해도 된다는 식으로 써있지만, 이기능을 어떻게 사용하는지 명확한 설명이 없어서 저처럼 헤메는 일이 없도록 공유해봅니다.

우선 중요한 것은 하나의 scene에 사용되는 모든 material을 모아야 합니다. 여러 scene을 돌아가면서 로드해도 되는데,

문제는 그렇게 하려면 게임을 실행시켜서 모든 scene을 돌아가면서 열어야 하는 번거로움이 있습니다.

수동으로 shader를 기능에 등록만 하면 되지 않을까 생각하지만, 이 기능은 material에서 실제 사용되는 옵션을 저장하는 방식을 가지고 있기 때문에 작업자가 이 옵션을 일일히 넣는다는건 유니티에 shader에 대해 완전히 파악한 사람이 아니고서는 솔직히 어려움이 있습니다. 또한, 여러 shader를 만들었다면...생각만해도.. 끔찍...

그래서 저는 일단 모든 material을 하나의 Scene에 모으는 툴을 프로그램머분에게 요청하고, 그리고 이를 Shadervaiant로 저장하는 방법을 택하였습니다.
다음 영상은 Shadervaiant을 생성하는 과정입니다. 

(Clear를 누르고 씬을 저장하고 게임실행하고 Save to asset 한번 눌러주고 하면 수치가 일정하게 나오는거 같습니다.

이순서가 중요한거 같네요.)

간혹 숫자가 자꾸 변경이된다면, 이펙트와 같은 렌덤이 있는 오브젝트가 있을수 있으니 이런 부분은 제거하여야 합니다.

 

 

 

 

'Unity > HDRP' 카테고리의 다른 글

HDRP에서 Emssion 사용시 주의점  (0) 2022.06.24
HDRP와 URP의 빛의 차이  (0) 2022.02.10
URP, HDRP 라이트맵(shadowmask) 설정  (0) 2022.01.18
HDRP Quality 셋팅  (0) 2021.10.08
HDRP 초기 셋팅(Project Setting)01  (0) 2021.09.18
Shader "URPTraining/TextureAlpha"
{

	Properties{

	_MainTex("Main Texture", 2D) = "white" {}
	_Transparency("Transparency", Range(0,1)) = 0.5

	}

		SubShader
	{
		Tags
	{
		"RenderPipeline" = "UniversalPipeline"
		"RenderType" = "TransparentCutout"
		"Queue" = "Alphatest"
	}
		Pass
	{
		Name "Universal Forward"
		Tags{ "LightMode" = "UniversalForward" }

		Blend SrcAlpha OneMinusSrcAlpha
		Cull Back
		Zwrite off

		HLSLPROGRAM
#pragma prefer_hlslcc gles
#pragma exclude_renderers d3d11_9x

#pragma vertex vert
#pragma fragment frag


#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"

#pragma multi_compile _ _MAIN_LIGHT_SHADOWS // sbr batcher

		CBUFFER_START(UnityPerMaterial) // sbr batcher

		float _Transparency;
	float4 _MainTex_ST;
	Texture2D _MainTex;
	SamplerState sampler_MainTex;

	CBUFFER_END // sbr batcher

		struct VertexInput
	{
		float4 vertex : POSITION;
		float2 uv       : TEXCOORD0;
	};

	struct VertexOutput
	{
		float4 vertex  	: SV_POSITION;
		float2 uv      	: TEXCOORD0;
	};

	VertexOutput vert(VertexInput v)
	{
		VertexOutput o;

		o.vertex = TransformObjectToHClip(v.vertex.xyz);
		o.uv = v.uv.xy * _MainTex_ST.xy + _MainTex_ST.zw;

		return o;
	}

	half4 frag(VertexOutput i) : SV_Target
	{
		float4 color = _MainTex.Sample(sampler_MainTex, i.uv);

		color.a *= _Transparency;

		return color;
	}
		ENDHLSL
	}
	}

}

https://docs.google.com/document/d/1UX0319CXa29fCFAgg0qa5vnH-U6875jt0KLKUk5mke8/edit

 

URP Shader Basic

URP Shader Basic term 2 Shader란? 2 Basic simple basic code 2 Shader “shader folder name / shader name” 3 Properties에서 변수 설정하고 매터리얼에서 확인 3 SubShader 4 Shader Tag 5 Rendering Order - Queue Tag 5 Render type 5 Pass 5 HLSL

docs.google.com

https://www.youtube.com/watch?v=mlNWoROvavY 

SubShader
    {
       Tags { "RenderType" = "Opaque"
              "RenderPipeline" = "UniversalPipeline"
              "UniversalMaterialType" = "SimpleLit" 
              "IgnoreProjector" = "True"
              "ShaderModel"="4.5"}
        Pass
        {
           Name "ForwardLit"
           Tags { "LightMode" = "UniversalForward" }
           …
        }
   
        Pass
        {
            Name "ShadowCaster"
            Tags{"LightMode" = "ShadowCaster"}
          …
        }
       Pass
        {
            Name "GBuffer"
            Tags{"LightMode" = "UniversalGBuffer"}
        …
        }
       Pass
       {
            Name "DepthOnly"
            Tags{"LightMode" = "DepthOnly"}
       …
       }

아무리봐도 그다지 차이가 없는데, 풀 코드를 봐서도 그다지 두개의 차이점을 알아낼수가 없었습니다.

다만, 모바일에는 path를 주어서 path을 막아버릴수 있다는거 외에는 그래서 뭐가 정확히 다른가하고 문의한 결과.

 

Each shader in the UTS2 mobile version omits the FORWRD_DELTA pass.
This pass functionally handles the toon processing of the real-time point light, but since the real-time point light itself is a heavy function in the mobile environment, we have omitted this pass to reduce the task of shaders.

 

라고 답변이 왔습니다.

짧은 번역 능력으로 해설하자면, 모바일은 FORWRD_DELTA pass가 빠져있어서, 리얼타임 포인트라이트가 영향을 받지 않도록 설계가 되어있다고.... 

해서 다시 코드를 보니.. 빠져있군요.. 아직 갈길이 멀었군요.. 이정도는 눈치챘어야했는데.ㅋ

 

 

 

'Unity > ETC' 카테고리의 다른 글

Unity LUT  (0) 2021.10.27
Asset Database version2?  (0) 2021.05.27
플렛폼별 대표 이미지 압축율 테스트  (0) 2021.05.13
Galaxy S21, S7, fire HD 10 스펙  (0) 2021.05.12
빌드후에 라이트문제가 발생했을때  (0) 2020.12.30

 

Z는 공간에서 Z축 위치를 뜻하며,Buffer는 카메라와 물체의 거리를 저장하는 메모리 공간을 의미합니다.

 

처음엔 초록색을 그리고, 그다음엔 빨간색을 그리고, 그다음은 파란색순으로 색위를 덫칠한다고 생각해야합니다.

위 과정으로 화면에  컬러들이 표시된다고 상상하면 됩니다.

 

Unity는 Cull , Zwrite, Ztest의 세가지 옵션을 제공합니다.

 

ZTest는 7가지 값이 있습니다.

ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always

기본값은 LEqual  (이미 그려진 오브젝트와 거리가 같거나 더 가까운 경우에 그립니다. 그보다 먼 경우에는 오브젝트로 숨깁니다)입니다.

 

Ztest와 Cull 를 이용하면 재미있는 형태를 만들어 낼수 있다.

 


태그는 위와 같은 구문을 사용합니다. 위 Tag는 전체 셰이더에 영향을 주지만, pass 안에 있으면 선택한 pass에만 영향을 미칩니다.

 

장면에 물체를 그릴때 마다 객체 정보를 GPU에 전달하고 이 그리는 과정을 "Draw Call"이라고 합니다. 셰이더에 pass가 많을수록 드로우콜이 늘어납니다.(카메라는 가장 먼거리에서부터 가까운 물체를 그립니다.)

 

Unity에 처리 대기열을 Render Queue라고 합니다.

Render Queue를 수정하는 방법은 두가지 방법이 있습니다.

위처럼 material inspector의 숫자를 변경하여 순서를 정하거나, 

아래 셰이더 Tag를 이용하는 방법입니다.

 

 

Queue의 순서는 다음과 같습니다.

"Queue"= "배경" 범위는 0 ~ 1499입니다. 기본값은 1000입니다.
"Queue"= "지오메트리" 1500 ~ 2399 범위 기본값은 2000입니다.
"Queue"= "AlphaTest" 2400 ~ 2699 범위 기본값은 2450입니다.
"Queue"= "투명"  2700 ~ 3599 범위 기본값은 3000입니다.
"대기열"= "오버레이" 범위는 3600에서 5000까지입니다. 기본값은 4000입니다.


블랜딩 종류
각종 블랜딩 옵션 설정 방법

 SubShader
    {
        Tags 
        { 
            "RenderType"="Opaque"
            "Queue" = "Transparent"
        }
        
            ZWrite Off
            Blend SrcAlpha OneMinusSrcAlpha //전통적인 투명
            //Blend One OneMinusSrcAlpha // 미리 곱해진 투명
            //Blend One One //ADD
            //Blend OneMinusDstColor One // SOFT ADD
            //Blend DstColor Zero // MULTIPLY
            //Blend DstColor SrcColor // 2X MULTIPLY
            //Blend SrcColor One //OVERLAY
            //Blend OneMinusSrcColor One //SOFT LIGHT
            //Blend Zero OneMinusSrcColor //SUBTRACT


            BlendOp Add  //Default Value
            //BlendOP Sub
            //BlendOP Max
            //BlendOP Min
            //BlendOP RevSub

        Pass

코드는 위처럼 만들어지게 되고, 그 결과는 아래와 같은 순서로 됩니다.

Blend SrcAlpha OneMinusSrcAlpha
Blend One OneMinusSrcAlpha
Blend One One
Blend OneMinusDstColor One
Blend DstColor Zero
Blend DstColor SrcColor
Blend SrcColor One
Blend OneMinusSrcColor One
Blend Zero OneMinusSrcColor
Blend One OneMinusSrcAlpha + BlendOP Sub

유니티 도움말 참고: docs.unity3d.com/Manual/SL-Blend.html

'Unity > Code base Shader' 카테고리의 다른 글

Microsoft HLSL  (0) 2021.02.09
인위적 유리 셰이더  (0) 2021.02.09
Unity Shader에 대한 이해  (0) 2021.01.01
Specular 다 광원지원  (0) 2020.12.21
SpecularShader  (0) 2020.12.19

Unity Shaders con CG/HLSL y Shader Graph 강의를 대충듣고 작성된겁니다.

(원어가 스페인어이고 이를 번역한 영어를 또 해석한거라 오역이 있을수 있습니다.)

 

 

물체가 화면에 뿌려지는 과정은 위와 같은과정을 거친다.

 

unity 쉐이더는 CG 코드를 사용한다.

CG언어는 NVIDIA와 마이크로소프트의 협력하여 만든 언어이다.

그리고 이것은 HLSL가 비슷한 구문으로 사용된다.

 

GLSL- OpenGL Shading Language

HLSL- High Level Shader Language

HLSL과 CG는 동일한 언어이지만 다른 이름을 반영합니다.

 

셰이더가 CG 언어로 작동하는 이유 HLSL과 GLSL을 모두 컴파일 할 수 있기 때문입니다.

 

1. Shader의 이름을 정의합니다.

2. Shader 속성을 정의합니다.

3. Shader 시작과끝

4. 하나 이상의 pass를 설정합니다.

 

반투명과 투명픽셀의 블랜딩을 설정하여 투명단계를 설정합니다.

Shader의 모든 속성은 쉐이더랩 언어로 선언됩니다.

이 모든것은 CG언어가 GPU에서 실행됩니다.

 

Unity는 두가지를 선택할수 있는 언어 옵션을 제공합니다.

Surface shader는 빠르고 쉽게 접근이 가능하지만 갖혀진 틀에서 작업해야하며,

Vertex/Fragment Shader는 좀더 많은 범위에서 조작이 가능해집니다.

 

속성은 8가지로 작성될수 있습니다.

 

투명과 불투명을 설정합니다. (이외에 뭐라 설명하는데 이해를 못했네요.)

 

투명패스, 컬러패스, 그림자패스등 렌더 패스를 나타냅니다.

패스가 많을수록 드로우콜이 늘어나게 됩니다.

 

Fallback은 subshader가 실패할 경우 사용해야 하는 기본 셰이더 이름에 해당합니다.

(만든 셰이더가 제대로 작동하지 않는다면 다른 셰이더를 사용하라는 일종에 대비에 해당됩니다.)

 

구조체 사용변수

 

정점 셰이더는 3D 모델의 각 정점에서 실행되는 프로그램입니다.

객체의 정점 위치를 "클립공간" "투사공간"이라고 불리는 자표계로 변환할수 있습니다.

 

물체에 텍스쳐를 붙이고 싶다면 우리는 UV좌표를 갖을 필요가 있습니다.

Fragment Shader는 객체가 화면에 차지하는 각 픽셀에서 실행되는 프로그램입니다.

 

Fragment Shader는 최종적으로 화면에 뿌려지는 픽셀이라고 설명할수 있습니다.

 

그래서 우리는 원하는 결과를 화면에 물체를 뿌리기 위해서는  Vertex Shader와 Fragment Shader 둘다 필요합니다.

 

Unity에서 셰이더를 생성하기위한 표준 언어가 HLSL입니다.

Unity에는 모바일 장치에서 더 나은 작동을 허용하는 몇 가지 추가 데이터 유형이 위처럼 있습니다.

더 높은 정밀도로 데이터 유형으로 작업 할 때 GPU 계산이 높을수록 그러므로,모바일 장치가 더 뜨거워지고 배터리가 더 많이 소모됩니다.

Float는 고정밀 32 비트 데이터 유형입니다.
Half는 16 비트 중간 정밀도 데이터 유형입니다.
fixed는 낮은 정밀도의 11 비트 데이터 유형입니다.

 

벡터와 행열

 

텍스처의 데이터 유형의 예

 

3D 물체가  화면에 뿌려주는 과정

 

float4x4는 UNITY_MATRIX_MVP 행렬에 해당하는 세 개의 개별 행렬이 결합 된 형태입니다.

로컬, 월드, 뷰, 프로젝션 

 

Local space : 물체의 중심을 기준으로 정의됩니다.

POSITION 시맨틱은 꼭지점 값을 이야기 합니다.

float4 vertex : POSITION 의미는 "vertex"변수에 모델의 초기 정점 위치를 저장하여 셰이더에 할당합니다.

 

World space: 포인트의 위치는 그리드의 중심을 기준으로 정의됩니다.

 

View space: 공간에서 한 지점 사이의 거리 좌표에 해당 카메라 뷰의 포인트입니다. 카메라 시선이라고 생각하면됩니다.

 

 

Projection space: 클립스페이스이다.

카메라 렌즈의 중앙에있는 거리와 관련하여 클립 공간이라고도하는 투영 공간에서 좌표 변환 프로세스는 카메라 Frustum와 관련하여 수행됩니다.

Frustum: 근거리 클리핑 평면, 원거리 클리핑 평면 및 시야로 정의됩니다.

SV_POSITION 의미론은 픽셀의 위치에 해당합니다.

(유니티정의:두 클리핑 평면과 경계선에 의해 잘린 피라미드의 형상이 되며, 이것을 뷰 Frustum이라고 합니다.)

 

 

UnityObjectToClipPos ()는 오브젝트를 로드할 때 정점의 위치는 오브젝트 공간에 로드됩니다

물체를 로드하는 방식은 여러가지 이나, 가장 적절하고 간단한 방법은 포함 된 기능을 사용하는 것입니다.

'Unity > Code base Shader' 카테고리의 다른 글

인위적 유리 셰이더  (0) 2021.02.09
Z-Buffer, Render Queue, Tag, Blending  (0) 2021.01.01
Specular 다 광원지원  (0) 2020.12.21
SpecularShader  (0) 2020.12.19
diffuseShader  (0) 2020.12.15

Vertex Color(메쉬의 버텍스 컬러를 이용한 텍스쳐 겹치기 방법:배경 바닥에서 주로 사용된다.)

View Direction - 카메라가 보는 방향

Gradient - 컬러를 그라디언트로(fixed로 하면 끊어진 컬러가 된다.)

Sample gradient - 시간을 넣을수 있다.(이외에 다른것도..)

Ambient - 하늘, 적도, 바닥 컬러를 정해준다. 라이트맵(환경광)의 컬러를 가져오는걸 알수있다.

Baked GI - 베이킹된 맵을 텍스쳐로 사용할수있다.(diffuse로 사용할수 있다는 뜻인데, 용도는 모르겠음.)

 

Refraction Probe - 반사 효과를 넣을수 있다.

'Unity > Shader Graph & Amplify' 카테고리의 다른 글

툰 쉐이더 Amplify shader set  (0) 2020.11.02
Shader graph-input03  (0) 2020.07.12
Shader graph -input01  (0) 2020.06.11
Shader graph -channel01  (0) 2020.06.10
Shader graph -Artistic03  (0) 2020.06.10

Boolean- 참, 거짓...(스위치이다.)

Color- 뭔말이 필요한가...

 

상수라고함.(어디에 쓰임있는지 아직모름..)

PI- 파이임..(3.1415926)

TAU- 파이에 2를 곱한 값.(6.28318530)

PHI- 황금비율(1.618034)

E- 지속적으로 무한으로 다가가는 (고라니TV 참고)
SQRT- 2의 제곱근 . 루트2

 

Integer -정수

Slider - float값을 기반으로 하는 최소최대치를 만든다.

Time-

Time- 1초마다 증가

SineTime- 싸인 그래프로 증가(1.6초면 1이 되고, 3.14초면 0이되고... -1)

CosineTime - 코싸인 그래프로 증가(1.6초면 0되고, 3.14초면 1이되고....-1)

DeltaTime - 프레임간에 시간차이를 매번 다르기 때문에 이를 보완하여 일정하게 만드는것.

SmoothDelta - 델타타임을 좀더 부드러운 간격으로 만든것.

 

Vector(float, uv, vertex...)

vector를 통하여 빼거나 더할수도 있다.

 

Bitangent Vector

출처: http://rapapa.net/?p=2419

object 좌표계:  각 오브젝트의 local로 본 좌표계

world 좌표계: 월드를 중심으로 본 좌표계

view 좌표계: 카메라의 로컬에서 x,y는 그대로이나 z가 반대인 좌표계

tangent 좌표계: 탄젠트벡터(U=x), 비탄젠트(V=y), 노멀벡터(z) 오브젝트이 각 정점마다 탄젠트 좌표계가 존재.

 

Positon

 

Screen Position

(잘안되서 헤멤: UniversalRenderPipelineAsset에 OpaqueTexture가 체크되어야 하며, 가능하면 DepthTexture까지 둘다 체크하고 개발.)

 

Tangent vector

어디에 쓰임있는지 모르겠음..

 

 

UV

 

고라니TV  외에 여러 사이트에서 참고하였습니다.

'Unity > Shader Graph & Amplify' 카테고리의 다른 글

Shader graph-input03  (0) 2020.07.12
Shader graph-input02  (0) 2020.06.29
Shader graph -channel01  (0) 2020.06.10
Shader graph -Artistic03  (0) 2020.06.10
Shader graph -Matcap  (0) 2020.05.30

그레이 컬러를 더했을때와 vector3를 더했을때 달라지는 이유는

 

color Sapce를 gamma로 바꾸면 똑같아진다.

요렇게 하면 똑같아진다.

 

split- 쪼개고, combine- 묶고

Flip- RGBA를 뒤집는다.(마이너스로 변환)

Swizzle- RGBA채널을 바꿀수 있다.

고라니TV  외에 여러 사이트에서 참고하였습니다.

'Unity > Shader Graph & Amplify' 카테고리의 다른 글

Shader graph-input02  (0) 2020.06.29
Shader graph -input01  (0) 2020.06.11
Shader graph -Artistic03  (0) 2020.06.10
Shader graph -Matcap  (0) 2020.05.30
Shader graph -Artistic02  (0) 2020.05.29