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

다만, 모바일에는 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

글로만 봐서는 뭔가 현실감이 없어서 직접 압출율을 테스트 진행해봤습니다.

상황에 따라 다르지만, RGB Crunched ETC가 좋네요.

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

Asset Database version2?  (0) 2021.05.27
UTS2 Shader 모바일용과 일반의 차이  (0) 2021.05.25
Galaxy S21, S7, fire HD 10 스펙  (0) 2021.05.12
빌드후에 라이트문제가 발생했을때  (0) 2020.12.30
Post Process 실시간 값 변경  (0) 2020.12.22

정점셰이더

struct VS_INPUT //입력을 받는 곳
{
   float4 mPosition : POSITION; //버텍스에서 위치 정보를 받기 위한 시맨틱(DirectX의 버텍스
   로부터 위치 정보를 구하는 기능)
   
   float3 mNormal : NORMAL; // 법선(노멀) 시맨틱
   
};

struct VS_OUTPUT // 정점셰이더가 위치변환 결과를 래스터라이저 하는 과정(이다음에 픽셀
//셰이더로 넘어간다.) 출력하는곳이다.

{
   float4 mPosition : POSITION; //정점 좌표를 위한 시맨틱
   float2 mUV : TEXCOORD0; // (TEXCOORD0) UV좌표 위한 시맨틱
   float2 mDiffuse : TEXCOORD1; 
   float3 mViewDir: TEXCOORD2; // 
   float3 mReflection: TEXCOORD3;  //정반사를 받기 위한 표면 시맨틱
   
};

float4x4 gWorldMatrix; // 월드 공간
float4x4 gViewMatrix;  // 뷰공간(월드공간안에 카메라로 찍힌 공간)
float4x4 gProjectionMatrix; // 투영공간(카메라에 찍힌 물체의 거리가 인지되는것을 
화면으로 그려지는 이미지?)

float4 gWorldLightPositon; //라이트 위치
float4 gWorldCameraPositon; // 카메라 위치(정반사를 구하기위함)


VS_OUTPUT vs_main( VS_INPUT Input ) // VS_OUTPUT로 보내기전에 함수를 작성하는 곳
{
   VS_OUTPUT Output; //반환할 구조체 선언

   Output.mPosition = mul( Input.mPosition, gWorldMatrix ); //mPosition을 공간으로 변환
   
   float3 lightDir = Output.mPosition.xyz - gWorldLightPositon.xyz; //노멀의 위치값을 구한다.
   //정점위치에서 빛위치을 빼주면 정점이 빛에서 어떤 위치에 있는지 알수 있다.
   //난반사를 구하는 값이다.
   lightDir = normalize(lightDir); // 벡터(vector)를 1로 만드는 과정.
   
   float3 viewDir = normalize(Output.mPosition.xyz - gWorldCameraPositon.xyz);
   //정점에서 카메라위치를 빼주면 마찬가지로 정점이 카메라에서 어떤 위치인지 알수 있다.
   //정반사를 구하는 값이다.
   Output.mViewDir = viewDir;
   
   
   Output.mPosition = mul( Output.mPosition, gViewMatrix ); //mPosition을 뷰공간화
   Output.mPosition = mul( Output.mPosition, gProjectionMatrix ); //mPosition을 투영공간화
   
   float3 worldNormal = mul(Input.mNormal, (float3x3)gWorldMatrix); //법선(노멀)을 월드공간으로 변환
   worldNormal = normalize(worldNormal); //난반사
   
   Output.mDiffuse = dot(-lightDir, worldNormal); // 법선을 구할 내적(코사인을 간략한것)
   Output.mReflection = reflect(lightDir, worldNormal); //정반사
   
   Output.mUV = Input.mUV; //텍스쳐UV

    
   return Output;
   
}

픽셀셰이더

struct PS_INPUT //화면에 출력될 픽셀정보에 필요로 하는 것을 넣는다.
//버텍스의 정보가 변화되는 내용이 없기 때문이다. mPosition만 없다.
{
   float2 mUV : TEXCOORD0;
   float3 mDiffuse : TEXCOORD1;
   float3 mViewDir: TEXCOORD2;
   float3 mReflection: TEXCOORD3;
   
};
   

float4 ps_main(PS_INPUT Input) : COLOR //ps_main함수
{   
   
   float4 albedo = tex2D(DiffuseSampler, Input.mUV); //텍스쳐
   
   //float3 diffuse = saturate(Input.mDiffuse); //난반사
    float3 diffuse = gLightColor * albedo.rgb * saturate(Input.mDiffuse);//난반사에 텍스쳐를 추가
    
   float3 reflection = normalize(Input.mReflection);
   float3 ViewDir = normalize(Input.mViewDir);
   
   float3 specular = 0;   
   if(diffuse.x >0) //정반사 (빛이 닿지않는 부분은 필요없기때문에 0이상으로 설정)
   {
      specular = saturate(dot(reflection, -ViewDir)); 
      specular = pow(specular, 20.0f); // 난반사보다 강해야 하므로,
      //빛을 강하게 받아야하니 강제로 값을 올려준다.
   
   }
   
   float3 ambient = float3(0.1f, 0.1f, 0.1f); //물체의 어두운부분이 너무 어둡지 않게
   //임의로 밝게 처리(환경광효과처럼 넣는다.) 
   //즉, 실제 반사가 되서 밝아진것이 아니라 강제로 밝게 한것이다.

   
   
   return float4(ambient + diffuse + specular, 1);
   
}

 

 

 

참고서적: 셰이더 프로그래밍입문의 RenderMonkey기반

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

Fake Shine  (0) 2021.02.13
Microsoft HLSL  (0) 2021.02.09
인위적 유리 셰이더  (0) 2021.02.09
Z-Buffer, Render Queue, Tag, Blending  (0) 2021.01.01
Unity Shader에 대한 이해  (0) 2021.01.01

docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-semantics

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

HLSL기본 (Phong shader)  (0) 2021.04.22
Fake Shine  (0) 2021.02.13
인위적 유리 셰이더  (0) 2021.02.09
Z-Buffer, Render Queue, Tag, Blending  (0) 2021.01.01
Unity Shader에 대한 이해  (0) 2021.01.01

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NPC_Chair_Random : StateMachineBehaviour
{
    // OnStateEnter is called before OnStateEnter is called on any state inside this state machine
    //override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    //{
    //    
    //}

    // OnStateUpdate is called before OnStateUpdate is called on any state inside this state machine
    //override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    //{
    //    
    //}

    // OnStateExit is called before OnStateExit is called on any state inside this state machine
    //override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    //{
    //    
    //}

    // OnStateMove is called before OnStateMove is called on any state inside this state machine
    //override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    //{
    //    
    //}

    // OnStateIK is called before OnStateIK is called on any state inside this state machine
    //override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    //{
    //    
    //}

    // OnStateMachineEnter is called when entering a state machine via its Entry Node
    override public void OnStateMachineEnter(Animator animator, int stateMachinePathHash)
    {
        animator.SetInteger("MoveID", Random.Range(0, 2)); //""따옴표 때문에 에러가 나서 헤멤.
    }

    // OnStateMachineExit is called when exiting a state machine via its Exit Node
    //override public void OnStateMachineExit(Animator animator, int stateMachinePathHash)
    //{
    //    
    //}
}

'Unity > C#' 카테고리의 다른 글

LayerChanger  (0) 2021.06.08
물체의 랜덤 스케일  (0) 2021.01.04
재미로 만들어보는 유니티(콘솔) 로또  (0) 2020.12.29
유리가 깨지는 연출  (0) 2020.12.15
Sin, Cos, Tan  (0) 2020.12.15