コード例 #1
0
        internal override IEnumerable <SceneObjectBatch> GetGeometries(GraphicsContext ctx, SceneGraphContext ctxScene)
        {
            if ((ctxScene.Scene.SceneFlags & SceneGraphFlags.BoundingVolumes) != 0)
            {
                GraphicsStateSet boundingVolumeState = ctxScene.GraphicsStateStack.Current.Push();

                // Transform
                TransformStateBase boundingVolumeModel = (TransformStateBase)boundingVolumeState[TransformStateBase.StateSetIndex];

                float lightVolumeDepth = 100.0f;
                float lightVolumeSize  = lightVolumeDepth * (float)Math.Tan(Angle.ToRadians(FalloffAngle));

                boundingVolumeModel.LocalModelViewProjection.Set(boundingVolumeModel.LocalModelViewProjection.Multiply(LightMatrix));
                boundingVolumeModel.LocalModelViewProjection.Translate(0.0f, 0.0f, lightVolumeDepth);
                boundingVolumeModel.LocalModelViewProjection.Scale(lightVolumeSize, lightVolumeSize, lightVolumeDepth);

                // Uniform color
                ShaderUniformState uniformState = new ShaderUniformState("UniformState");
                uniformState.SetUniformState("glo_UniformColor", new ColorRGBAF(1.0f, 1.0f, 0.0f, 0.5f));
                boundingVolumeState.DefineState(uniformState);
                // Alpha blending
                boundingVolumeState.DefineState(BlendState.AlphaBlending);

                yield return(new SceneObjectBatch(
                                 _BoundingVolumeArrays,
                                 boundingVolumeState,
                                 _BoundingVolumeProgram
                                 ));
            }

            yield break;
        }
コード例 #2
0
        private SceneObject CreateSkyBoxObject()
        {
            if (!Gl.CurrentExtensions.TextureCubeMap_ARB)
            {
                return(null);
            }

            SceneObjectGeometry skyboxObject = new SceneObjectGeometry();

            #region Texture

            OpenGL.Objects.Image[] cubeMap = new OpenGL.Objects.Image[6];

            using (Stream imageStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("HelloObjects.Data.PiazzaDelPopolo.posx.jpg"))
                cubeMap[0] = ImageCodec.Instance.Load(imageStream, ImageFormat.Jpeg);
            using (Stream imageStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("HelloObjects.Data.PiazzaDelPopolo.negx.jpg"))
                cubeMap[1] = ImageCodec.Instance.Load(imageStream, ImageFormat.Jpeg);
            using (Stream imageStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("HelloObjects.Data.PiazzaDelPopolo.posy.jpg"))
                cubeMap[2] = ImageCodec.Instance.Load(imageStream, ImageFormat.Jpeg);
            using (Stream imageStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("HelloObjects.Data.PiazzaDelPopolo.negy.jpg"))
                cubeMap[3] = ImageCodec.Instance.Load(imageStream, ImageFormat.Jpeg);
            using (Stream imageStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("HelloObjects.Data.PiazzaDelPopolo.posz.jpg"))
                cubeMap[4] = ImageCodec.Instance.Load(imageStream, ImageFormat.Jpeg);
            using (Stream imageStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("HelloObjects.Data.PiazzaDelPopolo.negz.jpg"))
                cubeMap[5] = ImageCodec.Instance.Load(imageStream, ImageFormat.Jpeg);

            foreach (OpenGL.Objects.Image image in cubeMap)
            {
                image.FlipVertically();
            }

            TextureCube cubeMapTexture = new TextureCube();
            cubeMapTexture.Create(PixelLayout.RGB24, cubeMap);

            #endregion

            #region State

            skyboxObject.LocalModel.Scale(170.0f);

            skyboxObject.ObjectState.DefineState(new DepthTestState(DepthFunction.Less));
            skyboxObject.ObjectState.DefineState(new CullFaceState(FrontFaceDirection.Cw, CullFaceMode.Back));

            ShaderUniformState skyboxUniformState = new ShaderUniformState("OpenGL.Skybox");
            skyboxUniformState.SetUniformState("glo_CubeMapTexture", cubeMapTexture);
            skyboxObject.ObjectState.DefineState(skyboxUniformState);

            #endregion

            #region Program

            skyboxObject.ProgramTag = ShadersLibrary.Instance.CreateProgramTag("OpenGL.Skybox");
            skyboxObject.Program.Create(_Context);

            #endregion

            #region Vertex Array

            // Define vertex arrays
            skyboxObject.VertexArray = new VertexArrayObject();
            skyboxObject.VertexArray.SetArray(_CubeArrayPosition, VertexArraySemantic.Position);
            skyboxObject.VertexArray.SetElementArray(PrimitiveType.Triangles);
            skyboxObject.VertexArray.Create(_Context);

            #endregion

            return(skyboxObject);
        }