예제 #1
0
        private static string GetLUTInput(PICALUTInput Input, PICALUTScale Scale, int LUT)
        {
            //TODO: CosLightSpot and CosPhi
            string InputStr;

            switch (Input)
            {
            default:
            case PICALUTInput.CosNormalHalf:  InputStr = "CosNormalHalf";  break;

            case PICALUTInput.CosViewHalf:    InputStr = "CosViewHalf";    break;

            case PICALUTInput.CosNormalView:  InputStr = "CosNormalView";  break;

            case PICALUTInput.CosLightNormal: InputStr = "CosLightNormal"; break;

            case PICALUTInput.CosLightSpot:   InputStr = "CosLightSpot";   break;

            case PICALUTInput.CosPhi:         InputStr = "CosPhi";         break;
            }

            string Output = $"texture(LUTs[{LUT}], vec2(({InputStr} + 1) * 0.5, 0)).r";

            if (Scale != PICALUTScale.One)
            {
                string ScaleStr = Scale.ToSingle().ToString(CultureInfo.InvariantCulture);

                Output = $"min({Output} * {ScaleStr}, 1)";
            }

            return(Output);
        }
예제 #2
0
 public PICALUTInScale(uint Param)
 {
     Dist0    = (PICALUTScale)((Param >> 0) & 7);
     Dist1    = (PICALUTScale)((Param >> 4) & 7);
     Specular = (PICALUTScale)((Param >> 8) & 7);
     Fresnel  = (PICALUTScale)((Param >> 12) & 7);
     ReflecR  = (PICALUTScale)((Param >> 16) & 7);
     ReflecG  = (PICALUTScale)((Param >> 20) & 7);
     ReflecB  = (PICALUTScale)((Param >> 24) & 7);
 }
예제 #3
0
        public static float ToSingle(this PICALUTScale Scale)
        {
            switch (Scale)
            {
            case PICALUTScale.One:     return(1);

            case PICALUTScale.Two:     return(2);

            case PICALUTScale.Four:    return(4);

            case PICALUTScale.Eight:   return(8);

            case PICALUTScale.Quarter: return(0.25f);

            case PICALUTScale.Half:    return(0.5f);

            default: throw new ArgumentException("Invalid Scale value!");
            }
        }