Shader의 70번째 바이트용 Shader를 할 시간이 거의 없어요.

9514 단어 Unityshadertech

쉐더를 할 시간이 얼마 안 남았어요.


하마터면 Shader를 할 뻔했다.쉐더를 할 시간이 많지 않을 것 같아서요.
100부까지 열심히 하겠습니다.10년이 걸려도 돼요.
100편의 글을 배웠다면 초보자라도 이해할 수 있을 것 같아요.
이렇게 하는 거야.
※ 초보자는 필기 레벨로 기록
기술 보도로는 도움이 안 될 것 같습니다.

미리 준비하다


아래 참조
Shader 파트 1Unite 2017 애니메이션을 볼 때가 많지 않아요. (기초지식~종이 스크레이퍼로 색깔 바꾸기)

해바라기


한마디로'현실과 가상이 엇갈린다'는 기능이다.
AR에서는 현실감을 더 높이는 표현으로 활용된다.
아래 영상에서 보듯이'현실 공간에서의 사람 또는 물체'뒤에 가상 물체가 나타나는 상태를 말한다.
https://youtu.be/FCdxWkEj-vQ
【참조 링크】: 현실과 가상이 교차하는 새로운 기능을 실현하다

데모


큐브에 아욱을 Shader로 적용한 데모입니다.
이해하기 쉽게 윤곽을 그리다.
두 가지는 각자 다른 방법을 사용했기 때문이다.

Shader 샘플


Shader "Custom/ColorMaskOcclusion"
{
    SubShader
    {
        Tags {"Queue"="geometry-1"}
        ColorMask 0
        Pass {}
    }
}
이것은 아주 간단합니다.
ColorMask에서 지정한 채널은 0으로 설정되어 다음 조건에 맞는 대상을 그리지 않습니다.
· Ztest LEaual의 결과 불합격 대상
· RenderQue 2000개 이상의 객체
Shader "Custom/BlendOcclusion"
{
    SubShader
    {
        Tags
        {
            "Queue"="geometry-1"
        }

        //フラグメントシェーダーのAlpha値が0の場合、最終的な描画結果はカラーバッファに既に書き込まれている値になる
        //計算式 → 1 × フラグメントシェーダーの出力 + (1 - フラグメントシェーダーの出力するアルファ値) × カラーバッファに既に書き込まれている値
        //結果 → 1 × 0 + (1 - 0) × カラーバッファに既に書き込まれている値 = カラーバッファに既に書き込まれている値 つまりそのまま
        Blend One OneMinusSrcAlpha

        //フラグメントシェーダーのAlpha値が1の場合、最終的な描画結果はカラーバッファに既に書き込まれている値になる
        //計算式 → 0 × フラグメントシェーダーの出力 + フラグメントシェーダーの出力するアルファ値 × カラーバッファに既に書き込まれている値
        //結果 → 0 × 1 + 1 × カラーバッファに既に書き込まれている値 = カラーバッファに既に書き込まれている値 つまりそのまま
        //Blend Zero SrcAlpha

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_fwdbase

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex:POSITION;
            };

            struct v2f
            {
                float4 pos : SV_POSITION;
            };

            v2f vert(appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                return o;
            }

            float4 frag(v2f i) : COLOR
            {
                //最終的なAlpha値が0
                return 0;
                //最終的なAlpha値が1
                //return 1;
            }
            ENDCG
        }
    }
}
다음은 Blend를 사용하는 Shader입니다.
Blend에 대한 매개변수는 다음과 같습니다.
finalValue = sourceFactor * sourceValue operation destinationFactor * destinationValue
【인용원】: ShaderLab command: Blend
각 항목의 설명은 다음과 같다.
항목
설명
finalValue
대상 색 버퍼 값 쓰기
sourceFactor
블렌드 명령
sourceValue
적절한 Shader(Pass)에서 세그먼트 마스크에서 내보낸 값
operation
혼합 작업 명령(기본값은 Add)
destinationFactor
블렌드 명령
destinationValue
컬러 버퍼에 기록된 값
Shader 내의 주석과 중복되며 계산 결과의 예는 다음과 같다.
예) Blend OneMinus SrcAlpha, 세그먼트 마스크의 출력 α = 0의 경우
공식 - 1 × フラグメントシェーダーの出力 + (1 - フラグメントシェーダーの出力するアルファ値) × カラーバッファに既に書き込まれている値결과 - 1 × 0 + (1 - 0) × カラーバッファに既に書き込まれている値 = カラーバッファに既に書き込まれている値이 Shader는 Blend 명령을 사용하여 마지막으로 그려진 색상을 "컬러 버퍼에 기록된 값"으로 설정합니다.

알려진 문제


여기까지의 쉐더는 사실상 문제가 있다.
바로 GameView에서 해당 Shader의 위치가 어두워진 것입니다.

이는 Sceneview와 GameView에서 Skybox의 드로잉 시간이 다르기 때문입니다.
천공 상자의 그리기 시간은 장면 보기에서 가장 먼저, 게임 보기에서 불투명한 대상 다음의
【인용원】: Scene View에 표시되는 객체는 Game View로 표시되지 않습니다.
사실 이것은 그리 큰 문제가 없다.
왜냐하면, AR 체험 시 스카이박스를 그리는 것은 거의 불가능하기 때문이다.
AR 대상 이외에는 카메라의 이미지이기 때문에 이 문제에 큰 영향을 받지 않는다.
STYLY로 스카이박스 상태가 아닌 AR을 제작했다.
다음 링크를 통해 모바일 앱 재생을 열면 정상적으로 인코딩되었는지 확인할 수 있습니다.
https://gallery.styly.cc/scene/82868a29-9027-45e0-b949-0c8aed78fab2
다만, 적절한 모양새 디버깅을 GameView로 반영하려는 경우
내 생각에도 이런 상황이 있을 것 같으니 해결 방법도 적어 두어야 한다.
Skybox만 렌더링하는 카메라를 준비하여 메인 카메라 뒤에 그립니다.
대신 주 카메라가 Skybox를 그리지 않도록 설정되면 완료됩니다.

실제 컴퓨터에서 실행할 때 스카이박스용 카메라를 끄면
다 못 그릴 리가 없어.

참조 링크


Z 버퍼만 업데이트하는 스크레이퍼에 해바라기 설치
Cg Programming/Unity/Order-Independent Transparency
Cg Programming/Unity/Transparency
[OpenGL] FrameBuffer 및 RenderBuffer에 대한 노트
[Unity] 그림자만 비치는 바닥을 준비하고 바닥 아래를 보지 마세요.

좋은 웹페이지 즐겨찾기