예제 #1
0
        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);
 }