private List <Sampler> CreateSamplers(ShaderSubProgram shaderSubprogram) { /* * Unity supports three types of samplers * Coupled textures and sampler: * sampler2D _MainTex; * TODO: Investigate how they work * Separate textures and samplers: * Texture2D _MainTex; * SamplerState sampler_MainTex; // "sampler" + “_MainTex” * These samplers do not contain an entry in SamplerParameters * Inline sampler states: * Texture2D _MainTex; * SamplerState my_point_clamp_sampler; * These samplers do contain an entry in SamplerParameters * See https://docs.unity3d.com/Manual/SL-SamplerStates.html */ List <Sampler> samplers = new List <Sampler>(); foreach (TextureParameter textureParam in shaderSubprogram.TextureParameters) { if (textureParam.SamplerIndex < 0 || textureParam.SamplerIndex == 0xFFFF) { continue; } string samplerName = "sampler" + textureParam.Name; samplers.Add(new Sampler(samplerName, (uint)textureParam.SamplerIndex, false)); } foreach (SamplerParameter samplerParam in shaderSubprogram.SamplerParameters ?? Array.Empty <SamplerParameter>()) { SamplerFilterMode filterMode = (SamplerFilterMode)(samplerParam.Sampler & 0x3); SamplerWrapMode wrapU = (SamplerWrapMode)((samplerParam.Sampler >> 2) & 0x3); SamplerWrapMode wrapV = (SamplerWrapMode)((samplerParam.Sampler >> 4) & 0x3); SamplerWrapMode wrapW = (SamplerWrapMode)((samplerParam.Sampler >> 6) & 0x3); bool isComparisonSampler = (samplerParam.Sampler & 0x100) != 0; string samplerName; if (wrapU == wrapV && wrapU == wrapW) { samplerName = $"{filterMode}_{wrapU}"; } else { samplerName = $"{filterMode}_{wrapU}U_{wrapV}V_{wrapW}W"; } if (isComparisonSampler) { samplerName += $"_Comparison"; } samplerName += $"_Sampler{samplerParam.BindPoint}"; samplers.Add(new Sampler(samplerName, (uint)samplerParam.BindPoint, isComparisonSampler)); } samplers = samplers .OrderBy(s => s.BindPoint) .ToList(); System.Diagnostics.Debug.Assert(m_Samplers.Select(s => s.BindPoint).Distinct().Count() == m_Samplers.Select(s => s.BindPoint).Count(), "Duplicate sampler bindpoint"); System.Diagnostics.Debug.Assert(m_Samplers.Select(s => s.BindPoint).Distinct().Count() == m_Samplers.Select(s => s.BindPoint).Count(), "Duplicate sampler name"); return(samplers); }
public TextureSampler(SamplerMinFilter min, SamplerMagFilter mag, SamplerWrapMode str = SamplerWrapMode.ClampToEdge) : this(Native.TextureSampler.CreateSampler((byte)min, (byte)mag, (byte)str, (byte)str, (byte)str)) { ManuallyRegisterCache(NativePtr, this); }