개시하다
홀론스2에서는 현실 공간에서 다양한 대상을 표시할 수 있다.
또한, 나는 시각적으로 나타내는 대상과 실제 존재하는 기물 간의 관계를 표현하고 싶다
Spatial Mesh에 큰 광고를 붙이기로 했다.
이른바 피리칼
Spatial Mesh 바디와 다른 객체를 사용합니다.
Spatial Mesh의 임의 부위에 텍스쳐 상태를 붙여넣는 기법을 말합니다.
동작 결과
다음 영상에서 표준 Quad를 캡처하여 de 볼륨의 적용 범위를 설정합니다.
Holololens2의 Spatial Mesh에 Decal을 붙일 수 있게 됐다
#Hololens #Hololens2 #AR #MRTK #MixedReality (테스트 모드는 이전에 개인적인 일로 제작된 PDF 아이콘)
#XR -북촌규(@KeiKitamura JP)
pic.twitter.com/guuhBrPL7l Depth를 어느 정도 사용한 비교를 적용하면 벽과 대상을 서로 영향을 주는 표현식을 만들 수 있습니다.
VIDEO 개발 환경Unity 2019.4.3f1 Universal Render Pipeline 7.3.1 Shader Graph 7.3.1 MRTK 2.7.2.0
설치 Spatial Mesh와 텍스쳐를 제어하는 객체는 각각 섀도우 선을 준비합니다.
Spatial Mesh 측면의 면도기 Spatial Mesh 측면에서 Spatial Mesh의 Depth를 Depth Buffer에 쓰기br/> 객체의 텍스쳐 샘플링에서 Spatial Mesh의 위치 및 모양 가져오기 준비br/> Depth의 Depth Buffer에 쓰기 위해 Spatial Mesh 측면의 마스크의 Render Quee를 2450 이하로 제어합니다.p> Shader "DecalTest/DepthOnly"
{
Properties
{
}
SubShader
{
Tags { "RenderType"="Opaque" "Queue"="Geometry-1"}
LOD 100
Pass
{
Tags{"LightMode" = "DepthOnly"}
ZWrite On
ColorMask 0
HLSLPROGRAM
// Required to compile gles 2.0 with standard srp library
#pragma prefer_hlslcc gles
#pragma exclude_renderers d3d11_9x
#pragma target 2.0
#pragma vertex DepthOnlyVertex
#pragma fragment DepthOnlyFragment
// -------------------------------------
// Material Keywords
#pragma shader_feature _ALPHATEST_ON
//--------------------------------------
// GPU Instancing
#pragma multi_compile_instancing
#include "Packages/com.unity.render-pipelines.universal/Shaders/UnlitInput.hlsl"
#include "Packages/com.unity.render-pipelines.universal/Shaders/DepthOnlyPass.hlsl"
ENDHLSL
}
}
}
객체 측면의 그림자 객체 측면에서 먼저 Depth Buffer에서 Spatial Mesh의 모양을 읽습니다.br/> 읽은 Spatial Mesh의 모양을 토대로 모양에 맞게 텍스쳐를 샘플링합니다.br/> 대상 옆에 있는 Depth는 읽기만 하기 때문에, 이 대상 자체의 Depth는 쓰지 않습니다. 객체 측면의 섀도우 렌더기Que를 3000 이상으로 설정하십시오. October 16, 2021
1.Scene Depth를 기준으로 Spatial Mesh의 세계 공간 위치 계산br/>
2. 세계 공간의 위치를 대상 공간으로 전환합니다 객체 공간의 X, Y 좌표를 UV로 사용하여 텍스쳐를 샘플링합니다.br/> 사용 중인 객체의 UV 레이아웃에 따라 값을 적절하게 조정합니다.br/> 이번에 Quad에 텍스쳐를 지정할 때 각 좌표에 0.5 더하기p>
일반 농담기의 경우 Shader "DecalTest/DecalTest"
{
Properties
{
_MainTex("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType" = "Transparent" "Queue" = "Transparent" "IgnoreProjector" = "True" "renderPipeline" = "UniversalPipeline" }
Blend SrcAlpha OneMinusSrcAlpha
Cull Back
LOD 100
Pass
{
Name "Unlit"
HLSLPROGRAM
#pragma prefer_hlslcc gles
#pragma exclude_renderers d3d11_9x
#pragma vertex vert
#pragma fragment frag
#pragma shader_feature _ALPHATEST_ON
#pragma shader_feature _ALPHAPREMULTIPLY_ON
#pragma multi_compile_instancing
#pragma target 5.0
// _CameraDepthTextureの定義など
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlsl"
// VertexPositionInputなど
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
// LinearEyeDepth()など
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
struct Attributes
{
float4 positionOS : POSITION;
float2 uv : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct Varyings
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float3 positionWS : TEXCOORD1;
float4 projectedPosition : TEXCOORD2; // スクリーンスペース座標系の位置として使用
float4 viewDirectionOS : TEXCOORD3;
float3 cameraPositionOS : TEXCOORD4;
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
TEXTURE2D(_MainTex);
SAMPLER(sampler_MainTex);
// Inspectorに出すプロパティはCBUFFERに含める
CBUFFER_START(UnityPerMaterial)
float4 _MainTex_ST;
CBUFFER_END
Varyings vert(Attributes input)
{
Varyings output = (Varyings)0;
UNITY_SETUP_INSTANCE_ID(input);
UNITY_TRANSFER_INSTANCE_ID(input, output);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS.xyz);
output.vertex = vertexInput.positionCS;
output.uv = TRANSFORM_TEX(input.uv, _MainTex);
output.positionWS = vertexInput.positionWS;
// スクリーンスペース座標系の位置を取得
output.projectedPosition = vertexInput.positionNDC;
// オブジェクトスペースで「頂点からカメラへ向かう」ベクトルを取得
float3 viewDir = vertexInput.positionVS;
viewDir *= -1;
float4x4 viewToObjectMatrix = mul(UNITY_MATRIX_I_M, UNITY_MATRIX_I_V);
output.viewDirectionOS.xyz = mul((float3x3)viewToObjectMatrix, viewDir);
output.viewDirectionOS.w = vertexInput.positionVS.z;
// カメラ位置をビュー座標系からオブジェクトスペースに変換
output.cameraPositionOS = mul(viewToObjectMatrix, float4(0, 0, 0, 1)).xyz;
return output;
}
half4 frag(Varyings input) : SV_Target
{
UNITY_SETUP_INSTANCE_ID(input);
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
half2 uv = input.uv;
// Depthをサンプリング
// オブジェクトの奥に他のメッシュが無ければ何も描画しない
float sceneDepth01 = Linear01Depth(SAMPLE_TEXTURE2D_X(_CameraDepthTexture, sampler_CameraDepthTexture, UnityStereoTransformScreenSpaceTex(input.projectedPosition.xy / input.projectedPosition.w)).r, _ZBufferParams);
clip(step(0.01, 1 - sceneDepth01) - 0.01);
// 奥のメッシュのオブジェクトスペースの位置を取得するのにLinearEyeDepth()を使用する
float sceneDepth = LinearEyeDepth(SAMPLE_TEXTURE2D_X(_CameraDepthTexture, sampler_CameraDepthTexture, UnityStereoTransformScreenSpaceTex(input.projectedPosition.xy / input.projectedPosition.w)).r, _ZBufferParams);
// input.viewDirectionOS.zをwで割ることでオブジェクトスペースの奥行きを求める
input.viewDirectionOS.xyz /= input.viewDirectionOS.w;
float3 objectSpacePosBehind = input.cameraPositionOS + input.viewDirectionOS.xyz * sceneDepth;
/**********************************************************************************************/
// Quad使用を前提にUVを調整
float2 decalUv = objectSpacePosBehind.xy + 0.5;
// タイリングとオフセットを適用
decalUv = decalUv * _MainTex_ST.xy + _MainTex_ST.zw;
// テクスチャをサンプリング
float4 texColor = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, decalUv);
return texColor;
}
ENDHLSL
}
}
FallBack "Hidden/InternalErrorShader"
}
그림자선이 준비되면 Quad 등 대상에 적용되고 무늬를 지정합니다.
MRTK의 설정 MixedRealityToolkit > Spatial Awareness > Spatial Awarreness System Settings에 설정된 Spatial Mesh Observer Display Settings > Display Option을 Vissible로 설정br/> Display Settings > 방금 지정한 Spatial Mesh용 스크레이퍼 재료를 Vissible Material에 적용합니다.
편집기에서 확인할 때 Spatial Object Mesh Observer에서도 같은 설정을 하십시오.
기타 대형 대상에게 분배된 무늬의 Import Settings에서 Repeat Wrap 모드를 미리 설정하면 Spatial Mesh에서 텍스쳐를 어떻게 붙이는지 쉽게 확인할 수 있습니다.
이러한 설정을 한 후 Spatial Mesh에 대상 옆에 면도기를 사용한 대상을 놓으면 결과는 처음 애니메이션과 같습니다.