コード例 #1
0
        private List <string> FindUniforms(string shaderCode, BfshaLibrary.UniformBlock block, string blockName)
        {
            string swizzle = "x";

            Dictionary <string, string> UniformMapping = new Dictionary <string, string>();

            for (int i = 0; i < block.Uniforms.Count; i++)
            {
                string name = block.Uniforms.GetKey(i);
                int    size = 16;
                if (i < block.Uniforms.Count - 1)
                {
                    size = block.Uniforms[i + 1].Offset - block.Uniforms[i].Offset;
                }

                //
                int startIndex = (block.Uniforms[i].Offset - 1) / 16;
                int amount     = size / 4;

                int index = 0;
                for (int j = 0; j < amount; j++)
                {
                    UniformMapping.Add($"{blockName}[{startIndex + index}].{swizzle}", name);
                    if (swizzle == "w")
                    {
                        index++;
                    }

                    swizzle = SwizzleShift(swizzle);
                }
            }

            List <string> loadedUniforms = new List <string>();

            foreach (var line in shaderCode.Split('\n'))
            {
                //Uniforms are packed into 16 byte blocks
                //Check for the uniform block
                foreach (var val in UniformMapping)
                {
                    if (line.Contains(val.Key) && !loadedUniforms.Contains(val.Value))
                    {
                        loadedUniforms.Add(val.Value);
                    }
                }
            }
            return(loadedUniforms);
        }
コード例 #2
0
 public void CreateUsedUniformListPixel(BfshaLibrary.UniformBlock block, string uniform)
 {
     UsedPixelStageUniforms = FindUniforms(File.ReadAllText(FragPath), block, uniform);
 }
コード例 #3
0
 public void CreateUsedUniformListVertex(BfshaLibrary.UniformBlock block, string uniform)
 {
     UsedVertexStageUniforms = FindUniforms(File.ReadAllText(VertPath), block, uniform);
 }