コード例 #1
0
        HDShadowData CreateShadowData(HDShadowRequest shadowRequest, HDShadowAtlas atlas)
        {
            HDShadowData data = new HDShadowData();

            var devProj = shadowRequest.deviceProjection;
            var view    = shadowRequest.view;

            data.proj          = new Vector4(devProj.m00, devProj.m11, devProj.m22, devProj.m23);
            data.pos           = shadowRequest.position;
            data.rot0          = new Vector3(view.m00, view.m01, view.m02);
            data.rot1          = new Vector3(view.m10, view.m11, view.m12);
            data.rot2          = new Vector3(view.m20, view.m21, view.m22);
            data.shadowToWorld = shadowRequest.shadowToWorld;

            // Compute the scale and offset (between 0 and 1) for the atlas coordinates
            float rWidth  = 1.0f / atlas.width;
            float rHeight = 1.0f / atlas.height;

            data.atlasOffset = Vector2.Scale(new Vector2(rWidth, rHeight), new Vector2(shadowRequest.atlasViewport.x, shadowRequest.atlasViewport.y));

            data.shadowMapSize = new Vector4(shadowRequest.atlasViewport.width, shadowRequest.atlasViewport.height, 1.0f / shadowRequest.atlasViewport.width, 1.0f / shadowRequest.atlasViewport.height);

            data.viewBias      = shadowRequest.viewBias;
            data.normalBias    = shadowRequest.normalBias;
            data.flags         = shadowRequest.flags;
            data.edgeTolerance = shadowRequest.edgeTolerance;

            data.shadowFilterParams0.x = shadowRequest.shadowSoftness;
            data.shadowFilterParams0.y = HDShadowUtils.Asfloat(shadowRequest.blockerSampleCount);
            data.shadowFilterParams0.z = HDShadowUtils.Asfloat(shadowRequest.filterSampleCount);
            data.shadowFilterParams0.w = 0;

            return(data);
        }
コード例 #2
0
        HDShadowData CreateShadowData(HDShadowRequest shadowRequest, HDShadowAtlas atlas)
        {
            HDShadowData data = new HDShadowData();

            var devProj = shadowRequest.deviceProjection;
            var view    = shadowRequest.view;

            data.proj                  = new Vector4(devProj.m00, devProj.m11, devProj.m22, devProj.m23);
            data.pos                   = shadowRequest.position;
            data.rot0                  = new Vector3(view.m00, view.m01, view.m02);
            data.rot1                  = new Vector3(view.m10, view.m11, view.m12);
            data.rot2                  = new Vector3(view.m20, view.m21, view.m22);
            data.shadowToWorld         = shadowRequest.shadowToWorld;
            data.cacheTranslationDelta = new Vector3(0.0f, 0.0f, 0.0f);


            // Compute the scale and offset (between 0 and 1) for the atlas coordinates
            float rWidth  = 1.0f / atlas.width;
            float rHeight = 1.0f / atlas.height;

            data.atlasOffset = Vector2.Scale(new Vector2(rWidth, rHeight), new Vector2(shadowRequest.atlasViewport.x, shadowRequest.atlasViewport.y));

            data.shadowMapSize = new Vector4(shadowRequest.atlasViewport.width, shadowRequest.atlasViewport.height, 1.0f / shadowRequest.atlasViewport.width, 1.0f / shadowRequest.atlasViewport.height);

            data.viewBias      = shadowRequest.viewBias;
            data.normalBias    = shadowRequest.normalBias;
            data.flags         = shadowRequest.flags;
            data.edgeTolerance = shadowRequest.edgeTolerance;

            data.shadowFilterParams0.x = shadowRequest.shadowSoftness;
            data.shadowFilterParams0.y = HDShadowUtils.Asfloat(shadowRequest.blockerSampleCount);
            data.shadowFilterParams0.z = HDShadowUtils.Asfloat(shadowRequest.filterSampleCount);
            data.shadowFilterParams0.w = shadowRequest.minFilterSize;

            var hdAsset = (GraphicsSettings.renderPipelineAsset as HDRenderPipelineAsset);

            if (hdAsset.currentPlatformRenderPipelineSettings.hdShadowInitParams.shadowQuality == HDShadowQuality.VeryHigh && shadowRequest.lightType == (int)LightType.Directional)
            {
                data.shadowFilterParams0.x = shadowRequest.kernelSize;
                data.shadowFilterParams0.y = shadowRequest.lightAngle;
                data.shadowFilterParams0.z = shadowRequest.maxDepthBias;
            }

            if (atlas.HasBlurredEVSM())
            {
                data.shadowFilterParams0 = shadowRequest.evsmParams;
            }

            return(data);
        }
コード例 #3
0
        public static HDShadowData UnPackedShadowDataToShadowData(PackedShadowData data)
        {
            HDShadowData outData = default(HDShadowData);

            outData.rot0          = data.packedData1;
            outData.edgeTolerance = data.packedData1.w;

            outData.rot1  = data.packedData2;
            outData.flags = (int)data.packedData2.w;

            outData.rot2 = data.packedData3;
            outData.shadowFilterParams0.x = data.packedData3.w;

            outData.pos = data.packedData4;
            outData.shadowFilterParams0.y = data.packedData4.w;

            outData.proj = data.packedData5;

            outData.atlasOffset           = data.packedData6;
            outData.shadowFilterParams0.z = data.packedData6.z;
            outData.shadowFilterParams0.w = data.packedData6.w;

            outData.zBufferParam = data.packedData7;

            outData.shadowMapSize = data.packedData8;

            outData.viewBias = data.packedData9;

            outData.normalBias = data.packedData10.normalized;
            outData._padding   = data.packedData10.w;

            outData.shadowToWorld.SetColumn(0, data.packedData11);
            outData.shadowToWorld.SetColumn(1, data.packedData12);
            outData.shadowToWorld.SetColumn(2, data.packedData13);
            outData.shadowToWorld.SetColumn(3, data.packedData14);

            return(outData);
        }
コード例 #4
0
        public static PackedShadowData ToPackedShadowData(HDShadowData data)
        {
            PackedShadowData outData = default(PackedShadowData);

            outData.packedData1   = data.rot0;
            outData.packedData1.w = data.edgeTolerance;

            outData.packedData2   = data.rot1;
            outData.packedData2.w = (float)data.flags + Epsilon; //防止1,转换为float变成0.999999999998;

            outData.packedData3   = data.rot2;
            outData.packedData3.w = data.shadowFilterParams0.x;

            outData.packedData4   = data.pos;
            outData.packedData4.w = data.shadowFilterParams0.y;

            outData.packedData5 = data.proj;

            outData.packedData6   = data.atlasOffset;
            outData.packedData6.z = data.shadowFilterParams0.z;
            outData.packedData6.w = data.shadowFilterParams0.w;

            outData.packedData7 = data.zBufferParam;

            outData.packedData8 = data.shadowMapSize;

            outData.packedData9 = data.viewBias;

            outData.packedData10   = data.normalBias;
            outData.packedData10.w = data._padding;

            outData.packedData11 = data.shadowToWorld.GetColumn(0);
            outData.packedData12 = data.shadowToWorld.GetColumn(1);
            outData.packedData13 = data.shadowToWorld.GetColumn(2);
            outData.packedData14 = data.shadowToWorld.GetColumn(3);

            return(outData);
        }