From c5a78070cd458b7bf04f5093a1de00ca127e2df7 Mon Sep 17 00:00:00 2001 From: CrispyPin Date: Sat, 17 Jun 2023 21:13:30 +0200 Subject: [PATCH] raymarching stuff --- Assets/raymarched/Raymarching.unity | 185 +++++++++++++++++++- Assets/raymarched/raymarch_origin.shader | 22 +++ Assets/raymarched/raymarch_secondary.shader | 3 + Assets/raymarched/raymarcher.cginc | 14 ++ Assets/raymarched/sphere_1m.fbx | Bin 0 -> 29772 bytes Assets/raymarched/sphere_1m.fbx.meta | 97 ++++++++++ Assets/raymarched/surf_t.shader | 54 ++++++ Assets/raymarched/surf_t.shader.meta | 9 + Assets/raymarched/tes.shader | 89 ++++++++++ Assets/raymarched/tes.shader.meta | 9 + Assets/raymarched/test.mat | 77 ++++++++ Assets/raymarched/test.mat.meta | 8 + 12 files changed, 560 insertions(+), 7 deletions(-) create mode 100644 Assets/raymarched/sphere_1m.fbx create mode 100644 Assets/raymarched/sphere_1m.fbx.meta create mode 100644 Assets/raymarched/surf_t.shader create mode 100644 Assets/raymarched/surf_t.shader.meta create mode 100644 Assets/raymarched/tes.shader create mode 100644 Assets/raymarched/tes.shader.meta create mode 100644 Assets/raymarched/test.mat create mode 100644 Assets/raymarched/test.mat.meta diff --git a/Assets/raymarched/Raymarching.unity b/Assets/raymarched/Raymarching.unity index 177d9cb..c468f39 100644 --- a/Assets/raymarched/Raymarching.unity +++ b/Assets/raymarched/Raymarching.unity @@ -121,6 +121,98 @@ NavMeshSettings: debug: m_Flags: 0 m_NavMeshData: {fileID: 0} +--- !u!1 &695617482 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 695617484} + - component: {fileID: 695617483} + m_Layer: 0 + m_Name: Point Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &695617483 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 695617482} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 2 + m_Shape: 0 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 0 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &695617484 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 695617482} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.464, y: -0.099, z: 0.326} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &845829380 GameObject: m_ObjectHideFlags: 0 @@ -213,6 +305,85 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 124.6, y: -30, z: 0} +--- !u!1 &1059347476 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1059347479} + - component: {fileID: 1059347478} + - component: {fileID: 1059347477} + m_Layer: 0 + m_Name: Cylinder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &1059347477 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1059347476} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: c17c9048a4216420cad3de8ca5a67eeb, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &1059347478 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1059347476} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1059347479 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1059347476} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.244, y: -0.008, z: 0.638} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1450495540 GameObject: m_ObjectHideFlags: 0 @@ -299,9 +470,9 @@ Light: serializedVersion: 10 m_Type: 2 m_Shape: 0 - m_Color: {r: 1, g: 1, b: 1, a: 0} + m_Color: {r: 0, g: 0, b: 1, a: 0} m_Intensity: 1 - m_Range: 10 + m_Range: 2 m_SpotAngle: 30 m_InnerSpotAngle: 21.80208 m_CookieSize: 10 @@ -357,7 +528,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1450495540} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0.769, y: -0.886, z: -0.762} + m_LocalPosition: {x: 0.844, y: -0.907, z: 0.117} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} @@ -383,7 +554,7 @@ MeshFilter: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1450495540} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} + m_Mesh: {fileID: 4393975565123819156, guid: df3c2875c26809684829ae8983ab0a53, type: 3} --- !u!23 &1450495548 MeshRenderer: m_ObjectHideFlags: 0 @@ -510,7 +681,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1485771011} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -0.695, y: -0.723, z: -0.01} + m_LocalPosition: {x: -0.452, y: 0.221, z: -0.124} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} @@ -732,7 +903,7 @@ MeshFilter: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1651833084} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} + m_Mesh: {fileID: 4393975565123819156, guid: df3c2875c26809684829ae8983ab0a53, type: 3} --- !u!4 &1651833091 Transform: m_ObjectHideFlags: 0 @@ -741,7 +912,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1651833084} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: -0.757, z: 0} + m_LocalPosition: {x: 0.265, y: -0.757, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} diff --git a/Assets/raymarched/raymarch_origin.shader b/Assets/raymarched/raymarch_origin.shader index 5634caa..3306993 100644 --- a/Assets/raymarched/raymarch_origin.shader +++ b/Assets/raymarched/raymarch_origin.shader @@ -12,9 +12,31 @@ Tags { "RenderType"="Opaque" } Cull Off LOD 100 + Pass + { + // TODO: does this even do anything? its supposed to be on by default + ZWrite On + CGPROGRAM + #pragma vertex vertex + #pragma fragment fragment + + #define BASE_PASS + #include "raymarcher.cginc" + + v2f vertex (appdata v){ + return vert(v); + } + + fragOut fragment (v2f i) { + return frag(i); + } + ENDCG + } + Pass { Tags { "LightMode" = "ForwardAdd"} + ZWrite On CGPROGRAM #pragma vertex vertex #pragma fragment fragment diff --git a/Assets/raymarched/raymarch_secondary.shader b/Assets/raymarched/raymarch_secondary.shader index caaf9cc..e5648aa 100644 --- a/Assets/raymarched/raymarch_secondary.shader +++ b/Assets/raymarched/raymarch_secondary.shader @@ -27,6 +27,9 @@ fragOut fragment (v2f i) { return frag(i); + // fragOut o = frag(i); + // o.col = 0.4f; + // return o; } ENDCG } diff --git a/Assets/raymarched/raymarcher.cginc b/Assets/raymarched/raymarcher.cginc index 01f6e38..26fe127 100644 --- a/Assets/raymarched/raymarcher.cginc +++ b/Assets/raymarched/raymarcher.cginc @@ -5,6 +5,7 @@ define IS_SECONDARY_SHAPE to only render the second shape */ #include "UnityCG.cginc" +#include "UnityLightingCommon.cginc" struct appdata { @@ -107,12 +108,16 @@ float SecondShape(float3 p) { float GetDist(float3 p) { #ifdef IS_SECONDARY_SHAPE return SecondShape(p); +#else +#ifdef BASE_PASS + return FirstShape(p); #else float first = FirstShape(p); float3 second_pos = mul(unity_WorldToObject, _WorldSpaceLightPos0); float second = SecondShape(p - second_pos); return smin(first, second, 0.15f); #endif +#endif } //marches a ray through the scene @@ -143,6 +148,14 @@ float3 GetNormal(float3 p) { } fragOut frag (v2f i) { +#ifndef IS_SECONDARY_SHAPE +#ifndef BASE_PASS + if (length(_LightColor0 - float4(0,0,1,0)) > 0.01f ){ + discard; + } +#endif +#endif + float3 ro = i.ro; float3 rd = normalize(i.hitPos - ro); @@ -162,6 +175,7 @@ fragOut frag (v2f i) { // col *= float4(d, 1, 1, 1); fragOut o; o.col = col; + // o.col = _LightColor0; float4 vClipPos = mul(UNITY_MATRIX_VP, mul(unity_ObjectToWorld, float4(p, 1))); o.depth = (vClipPos.z / vClipPos.w + 1.0) * 0.5; return o; diff --git a/Assets/raymarched/sphere_1m.fbx b/Assets/raymarched/sphere_1m.fbx new file mode 100644 index 0000000000000000000000000000000000000000..615b70350bfcc822305365364b7e0ef5e7da2e41 GIT binary patch literal 29772 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 GSp6GYBKvRv literal 0 HcmV?d00001 diff --git a/Assets/raymarched/sphere_1m.fbx.meta b/Assets/raymarched/sphere_1m.fbx.meta new file mode 100644 index 0000000..220975d --- /dev/null +++ b/Assets/raymarched/sphere_1m.fbx.meta @@ -0,0 +1,97 @@ +fileFormatVersion: 2 +guid: df3c2875c26809684829ae8983ab0a53 +ModelImporter: + serializedVersion: 19301 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 1 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 1 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/raymarched/surf_t.shader b/Assets/raymarched/surf_t.shader new file mode 100644 index 0000000..e1c1929 --- /dev/null +++ b/Assets/raymarched/surf_t.shader @@ -0,0 +1,54 @@ +Shader "Custom/surf_t" +{ + Properties + { + _Color ("Color", Color) = (1,1,1,1) + _MainTex ("Albedo (RGB)", 2D) = "white" {} + _Glossiness ("Smoothness", Range(0,1)) = 0.5 + _Metallic ("Metallic", Range(0,1)) = 0.0 + } + SubShader + { + Tags { "RenderType"="Opaque" } + LOD 200 + + CGPROGRAM + // Physically based Standard lighting model, and enable shadows on all light types + #pragma surface surf Standard fullforwardshadows + + // Use shader model 3.0 target, to get nicer looking lighting + #pragma target 3.0 + + sampler2D _MainTex; + + struct Input + { + float2 uv_MainTex; + }; + + half _Glossiness; + half _Metallic; + fixed4 _Color; + + // Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader. + // See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing. + // #pragma instancing_options assumeuniformscaling + UNITY_INSTANCING_BUFFER_START(Props) + // put more per-instance properties here + UNITY_INSTANCING_BUFFER_END(Props) + + void surf (Input IN, inout SurfaceOutputStandard o) + { + // Albedo comes from a texture tinted by color + fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color; + o.Albedo = c.rgb; + // Metallic and smoothness come from slider variables + o.Metallic = _Metallic; + o.Smoothness = _Glossiness; + o.Alpha = c.a; + // o.Depth += 0.1; + } + ENDCG + } + FallBack "Diffuse" +} diff --git a/Assets/raymarched/surf_t.shader.meta b/Assets/raymarched/surf_t.shader.meta new file mode 100644 index 0000000..b9361a8 --- /dev/null +++ b/Assets/raymarched/surf_t.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f87aed02a2188c4f98cee590c5bfb06b +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/raymarched/tes.shader b/Assets/raymarched/tes.shader new file mode 100644 index 0000000..61138a2 --- /dev/null +++ b/Assets/raymarched/tes.shader @@ -0,0 +1,89 @@ +Shader "Unlit/tes" +{ + Properties + { + _MainTex ("Texture", 2D) = "white" {} + _Color ("Color", Color) = (1,1,1,1) + + } + SubShader + { + Tags { "RenderType"="Opaque" } + LOD 100 + ZWrite On + + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + // make fog work + #pragma multi_compile_fog + + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + }; + + struct v2f + { + float2 uv : TEXCOORD0; + // UNITY_FOG_COORDS(1) + float4 vertex : SV_POSITION; + float3 ro : TEXCOORD1; + float3 vert_obspace : TEXCOORD2; + }; + + struct fragOut + { + fixed4 col : SV_Target; + float depth : SV_Depth; + }; + + + sampler2D _MainTex; + float4 _MainTex_ST; + float4 _Color; + + v2f vert (appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.vert_obspace = v.vertex; + o.ro = mul(unity_WorldToObject, float4(_WorldSpaceCameraPos, 1)); + + o.uv = TRANSFORM_TEX(v.uv, _MainTex); + // UNITY_TRANSFER_FOG(o,o.vertex); + return o; + } + + fragOut frag (v2f i) + { + // sample the texture + fixed4 col = tex2D(_MainTex, i.uv); + + // apply fog + // UNITY_APPLY_FOG(i.fogCoord, col); + fragOut o; + // o.col = _Color*0.5; + o.col.a=1; + // o.depth = 1; + + float3 rd = normalize(i.vert_obspace - i.ro); + float d = 0;//-0.1; + float4 vClipPos = mul(UNITY_MATRIX_VP, mul(unity_ObjectToWorld, i.vert_obspace)); + // o.depth = (vClipPos.z / vClipPos.w + 1.0) * 0.5 ; + + // o.col.r = o.depth; + // o.col.gb = i.ro; + + return o; + } + ENDCG + } + } +} diff --git a/Assets/raymarched/tes.shader.meta b/Assets/raymarched/tes.shader.meta new file mode 100644 index 0000000..eaf7857 --- /dev/null +++ b/Assets/raymarched/tes.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6be601fdc9efee139829a555e35180f0 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/raymarched/test.mat b/Assets/raymarched/test.mat new file mode 100644 index 0000000..fc65447 --- /dev/null +++ b/Assets/raymarched/test.mat @@ -0,0 +1,77 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: test + m_Shader: {fileID: 4800000, guid: 6be601fdc9efee139829a555e35180f0, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 0.5330188, b: 0.6564782, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/raymarched/test.mat.meta b/Assets/raymarched/test.mat.meta new file mode 100644 index 0000000..837d9fa --- /dev/null +++ b/Assets/raymarched/test.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c17c9048a4216420cad3de8ca5a67eeb +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: