예제 #1
0
        public override void SetFixedFunctionProgramParameters(FixedFunctionProgramsParameters parameters)
        {
            _setProgramParameter(GpuProgramType.Vertex, "World", parameters.WorldMatrix);
            _setProgramParameter(GpuProgramType.Vertex, "View", parameters.ViewMatrix);
            _setProgramParameter(GpuProgramType.Vertex, "Projection", parameters.ProjectionMatrix);

            //maybe we could do an inverse function in shader
            _setProgramParameter(GpuProgramType.Vertex, "ViewIT", parameters.ViewMatrix.Inverse());
            var WorldViewIT = parameters.ViewMatrix * parameters.WorldMatrix;

            WorldViewIT = WorldViewIT.Inverse();
            _setProgramParameter(GpuProgramType.Vertex, "WorldViewIT", WorldViewIT);


            _setProgramParameter(GpuProgramType.Vertex, "MaterialAmbient", parameters.MaterialAmbient);
            _setProgramParameter(GpuProgramType.Vertex, "MaterialDiffuse", parameters.MaterialDiffuse);
            _setProgramParameter(GpuProgramType.Vertex, "MaterialSpecular", parameters.MaterialSpecular);
            //_setProgramParameter(GpuProgramType.Vertex, "MaterialEmissive", parameters.MaterialEmissive);
            //_setProgramParameter(GpuProgramType.Vertex, "MaterialShininess", parameters.MaterialShininess);

            #region shader Lights parameters

            if (parameters.LightingEnabled)
            {
                _setProgramParameter(GpuProgramType.Vertex, "BaseLightAmbient", parameters.LightAmbient);

                for (var i = 0; i < parameters.Lights.Count; i++)
                {
                    var curLight = parameters.Lights[i];
                    var prefix   = "";
                    prefix = "Light" + i + "_";

                    _setProgramParameter(GpuProgramType.Vertex, prefix + "Ambient", ColorEx.Black);
                    _setProgramParameter(GpuProgramType.Vertex, prefix + "Diffuse", curLight.Diffuse);
                    _setProgramParameter(GpuProgramType.Vertex, prefix + "Specular", curLight.Specular);

                    switch (curLight.Type)
                    {
                    case LightType.Point:
                    {
                        _setProgramParameter(GpuProgramType.Vertex, prefix + "Position",
                                             curLight.GetDerivedPosition());
                        _setProgramParameter(GpuProgramType.Vertex, prefix + "Range", curLight.AttenuationRange);
                        var attenuation = Vector3.Zero;
                        attenuation.x = curLight.AttenuationConstant;
                        attenuation.y = curLight.AttenuationLinear;
                        attenuation.z = curLight.AttenuationQuadratic;
                        _setProgramParameter(GpuProgramType.Vertex, prefix + "Attenuation", attenuation);
                    }
                    break;

                    case LightType.Directional:
                        _setProgramParameter(GpuProgramType.Vertex, prefix + "Direction", curLight.DerivedDirection);
                        break;

                    case LightType.Spotlight:
                    {
                        _setProgramParameter(GpuProgramType.Vertex, prefix + "Position",
                                             curLight.GetDerivedPosition());
                        _setProgramParameter(GpuProgramType.Vertex, prefix + "Direction", curLight.Direction);

                        Vector3 attenuation;
                        attenuation.x = curLight.AttenuationConstant;
                        attenuation.y = curLight.AttenuationLinear;
                        attenuation.z = curLight.AttenuationQuadratic;
                        _setProgramParameter(GpuProgramType.Vertex, prefix + "Attenuation",
                                             new Vector4(attenuation.x, attenuation.y, attenuation.z, 1));

                        Vector3 spot;
                        spot.x = curLight.SpotlightInnerAngle;
                        spot.y = curLight.SpotlightOuterAngle;
                        spot.z = curLight.SpotlightFalloff;
                        _setProgramParameter(GpuProgramType.Vertex, prefix + "Spot",
                                             new Vector3(spot.x, spot.y, spot.z));
                    }
                    break;
                    } // end of - switch (curLight->getType())
                }     // end of - for(size_t i = 0 ; i < params.getLights().size() ; i++)
            }         // end of -  if (params.getLightingEnabled())

            #endregion

            switch (parameters.FogMode)
            {
            case FogMode.None:
                break;

            case FogMode.Exp:
            case FogMode.Exp2:
                _setProgramParameter(GpuProgramType.Vertex, "FogDensity", (float)parameters.FogDensity);
                _setProgramParameter(GpuProgramType.Fragment, "FogColor", parameters.FogColor);
                break;

            case FogMode.Linear:
                _setProgramParameter(GpuProgramType.Vertex, "FogStart", (float)parameters.FogStart);
                _setProgramParameter(GpuProgramType.Vertex, "FogEnd", (float)parameters.FogEnd);
                _setProgramParameter(GpuProgramType.Fragment, "FogColor", parameters.FogColor);
                break;
            }

            for (var i = 0;
                 i < parameters.TextureMatricies.Count && i < fixedFunctionState.TextureLayerStates.Count;
                 i++)
            {
                if (parameters.TextureEnabled[i])
                {
                    _setProgramParameter(GpuProgramType.Vertex, "TextureMatrix" + StringConverter.ToString(i),
                                         parameters.TextureMatricies[i]);
                }
            }
        }
        public override void SetFixedFunctionProgramParameters( FixedFunctionProgramsParameters parameters )
        {
            _setProgramParameter( GpuProgramType.Vertex, "World", parameters.WorldMatrix );
            _setProgramParameter( GpuProgramType.Vertex, "View", parameters.ViewMatrix );
            _setProgramParameter( GpuProgramType.Vertex, "Projection", parameters.ProjectionMatrix );

            //maybe we could do an inverse function in shader
            _setProgramParameter( GpuProgramType.Vertex, "ViewIT", parameters.ViewMatrix.Inverse() );
            var WorldViewIT = parameters.ViewMatrix*parameters.WorldMatrix;
            WorldViewIT = WorldViewIT.Inverse();
            _setProgramParameter( GpuProgramType.Vertex, "WorldViewIT", WorldViewIT );


            _setProgramParameter( GpuProgramType.Vertex, "MaterialAmbient", parameters.MaterialAmbient );
            _setProgramParameter( GpuProgramType.Vertex, "MaterialDiffuse", parameters.MaterialDiffuse );
            _setProgramParameter( GpuProgramType.Vertex, "MaterialSpecular", parameters.MaterialSpecular );
            //_setProgramParameter(GpuProgramType.Vertex, "MaterialEmissive", parameters.MaterialEmissive);
            //_setProgramParameter(GpuProgramType.Vertex, "MaterialShininess", parameters.MaterialShininess);

            #region shader Lights parameters

            if ( parameters.LightingEnabled )
            {
                _setProgramParameter( GpuProgramType.Vertex, "BaseLightAmbient", parameters.LightAmbient );

                for ( var i = 0; i < parameters.Lights.Count; i++ )
                {
                    var curLight = parameters.Lights[ i ];
                    var prefix = "";
                    prefix = "Light" + i + "_";

                    _setProgramParameter( GpuProgramType.Vertex, prefix + "Ambient", ColorEx.Black );
                    _setProgramParameter( GpuProgramType.Vertex, prefix + "Diffuse", curLight.Diffuse );
                    _setProgramParameter( GpuProgramType.Vertex, prefix + "Specular", curLight.Specular );

                    switch ( curLight.Type )
                    {
                        case LightType.Point:
                        {
                            _setProgramParameter( GpuProgramType.Vertex, prefix + "Position",
                                                  curLight.GetDerivedPosition() );
                            _setProgramParameter( GpuProgramType.Vertex, prefix + "Range", curLight.AttenuationRange );
                            var attenuation = Vector3.Zero;
                            attenuation.x = curLight.AttenuationConstant;
                            attenuation.y = curLight.AttenuationLinear;
                            attenuation.z = curLight.AttenuationQuadratic;
                            _setProgramParameter( GpuProgramType.Vertex, prefix + "Attenuation", attenuation );
                        }
                            break;
                        case LightType.Directional:
                            _setProgramParameter( GpuProgramType.Vertex, prefix + "Direction", curLight.DerivedDirection );
                            break;
                        case LightType.Spotlight:
                        {
                            _setProgramParameter( GpuProgramType.Vertex, prefix + "Position",
                                                  curLight.GetDerivedPosition() );
                            _setProgramParameter( GpuProgramType.Vertex, prefix + "Direction", curLight.Direction );

                            Vector3 attenuation;
                            attenuation.x = curLight.AttenuationConstant;
                            attenuation.y = curLight.AttenuationLinear;
                            attenuation.z = curLight.AttenuationQuadratic;
                            _setProgramParameter( GpuProgramType.Vertex, prefix + "Attenuation",
                                                  new Vector4( attenuation.x, attenuation.y, attenuation.z, 1 ) );

                            Vector3 spot;
                            spot.x = curLight.SpotlightInnerAngle;
                            spot.y = curLight.SpotlightOuterAngle;
                            spot.z = curLight.SpotlightFalloff;
                            _setProgramParameter( GpuProgramType.Vertex, prefix + "Spot",
                                                  new Vector3( spot.x, spot.y, spot.z ) );
                        }
                            break;
                    } // end of - switch (curLight->getType())
                } // end of - for(size_t i = 0 ; i < params.getLights().size() ; i++)
            } // end of -  if (params.getLightingEnabled())

            #endregion

            switch ( parameters.FogMode )
            {
                case FogMode.None:
                    break;
                case FogMode.Exp:
                case FogMode.Exp2:
                    _setProgramParameter( GpuProgramType.Vertex, "FogDensity", (float)parameters.FogDensity );
                    _setProgramParameter( GpuProgramType.Fragment, "FogColor", parameters.FogColor );
                    break;
                case FogMode.Linear:
                    _setProgramParameter( GpuProgramType.Vertex, "FogStart", (float)parameters.FogStart );
                    _setProgramParameter( GpuProgramType.Vertex, "FogEnd", (float)parameters.FogEnd );
                    _setProgramParameter( GpuProgramType.Fragment, "FogColor", parameters.FogColor );
                    break;
            }

            for ( var i = 0;
                  i < parameters.TextureMatricies.Count && i < fixedFunctionState.TextureLayerStates.Count;
                  i++ )
            {
                if ( parameters.TextureEnabled[ i ] )
                {
                    _setProgramParameter( GpuProgramType.Vertex, "TextureMatrix" + StringConverter.ToString( i ),
                                          parameters.TextureMatricies[ i ] );
                }
            }
        }
예제 #3
0
 public abstract void SetFixedFunctionProgramParameters(FixedFunctionProgramsParameters parameters);
예제 #4
0
 public abstract void SetFixedFunctionProgramParameters( FixedFunctionProgramsParameters parameters );