예제 #1
0
        public static ParticleNode Create()
        {
            var blend = new BlendSwitch(BlendingSourceFactor.SourceAlpha, BlendingDestinationFactor.OneMinusSourceAlpha);
            var depthTest = new DepthTestSwitch(false);
            RenderMethodBuilder defaultBuilder, textureBuilder;
            {
                var vs       = new VertexShader(vert);
                var fs       = new FragmentShader(frag);
                var provider = new ShaderArray(vs, fs);
                var map      = new AttributeMap();
                defaultBuilder = new RenderMethodBuilder(provider, map, blend, depthTest);
            }
            {
                var vs       = new VertexShader(vert);
                var fs       = new FragmentShader(texturedFrag);
                var provider = new ShaderArray(vs, fs);
                var map      = new AttributeMap();
                textureBuilder = new RenderMethodBuilder(provider, map, blend, depthTest);
            }

            var model = new ParticleModel();
            var node  = new ParticleNode(model, defaultBuilder, textureBuilder);

            node.Initialize();

            return(node);
        }
 private void Form_Load(object sender, EventArgs e)
 {
     {
         var camera = new Camera(
             new vec3(0, 0, 5), new vec3(0, 0, 0), new vec3(0, 1, 0),
             CameraType.Perspecitive, this.glCanvas1.Width, this.glCanvas1.Height);
         var rotator = new SatelliteManipulater();
         rotator.Bind(camera, this.glCanvas1);
         this.camera = camera;
         this.rotator = rotator;
     }
     {
         IBufferable bufferable = new Teapot();
         var shaderCodes = new ShaderCode[2];
         shaderCodes[0] = new ShaderCode(File.ReadAllText(@"shaders\Transparent.vert"), ShaderType.VertexShader);
         shaderCodes[1] = new ShaderCode(File.ReadAllText(@"shaders\Transparent.frag"), ShaderType.FragmentShader);
         var map = new PropertyNameMap();
         map.Add("in_Position", "position");
         map.Add("in_Color", "color");
         var renderer = new PickableRenderer(bufferable, shaderCodes, map, "position");
         renderer.Name = "Order-Dependent Transparent Renderer";
         renderer.Initialize();
         {
             GLSwitch blendSwitch = new BlendSwitch(BlendingSourceFactor.SourceAlpha, BlendingDestinationFactor.OneMinusSourceAlpha);
             renderer.SwitchList.Add(blendSwitch);
         }
         this.renderer = renderer;
     }
     {
         var frmPropertyGrid = new FormProperyGrid();
         frmPropertyGrid.DisplayObject(this.renderer);
         frmPropertyGrid.Show();
         this.formPropertyGrid = frmPropertyGrid;
     }
 }
예제 #3
0
 private void Form02OrderIndependentTransparency_Load(object sender, EventArgs e)
 {
     {
         var camera = new Camera(
             new vec3(0, 0, 5), new vec3(0, 0, 0), new vec3(0, 1, 0),
             CameraType.Perspecitive, this.glCanvas1.Width, this.glCanvas1.Height);
         var rotator = new SatelliteRotator(camera);
         this.camera  = camera;
         this.rotator = rotator;
     }
     {
         IBufferable bufferable  = new Teapot();
         var         shaderCodes = new ShaderCode[2];
         shaderCodes[0] = new ShaderCode(File.ReadAllText(@"03OrderDependentTransparency\Transparent.vert"), ShaderType.VertexShader);
         shaderCodes[1] = new ShaderCode(File.ReadAllText(@"03OrderDependentTransparency\Transparent.frag"), ShaderType.FragmentShader);
         var map = new PropertyNameMap();
         map.Add("in_Position", "position");
         map.Add("in_Color", "color");
         var renderer = new PickableRenderer(bufferable, shaderCodes, map, "position");
         renderer.Name = "Order-Dependent Transparent Renderer";
         renderer.Initialize();
         {
             GLSwitch blendSwitch = new BlendSwitch(BlendingSourceFactor.SourceAlpha, BlendingDestinationFactor.OneMinusSourceAlpha);
             renderer.SwitchList.Add(blendSwitch);
         }
         this.renderer = renderer;
     }
     {
         var frmPropertyGrid = new FormProperyGrid();
         frmPropertyGrid.DisplayObject(this.renderer);
         frmPropertyGrid.Show();
         this.formPropertyGrid = frmPropertyGrid;
     }
 }
예제 #4
0
        /// <summary>
        /// Create a label renderer.
        /// </summary>
        /// <param name="maxCharCount">Max char count to display for this label. Careful to set this value because greater <paramref name="maxCharCount"/> means more space ocupied in GPU nemory.</param>
        /// <param name="labelHeight">Label height(in pixels)</param>
        /// <param name="fontTexture">Use which font to render text?</param>
        /// <returns></returns>
        public static LabelRenderer Create(int maxCharCount = 64, int labelHeight = 32, IFontTexture fontTexture = null)
        {
            if (fontTexture == null)
            {
                fontTexture = FontTexture.Default;
            }

            var model = new TextModel(maxCharCount);

            var shaderCodes = new ShaderCode[2];

            shaderCodes[0] = new ShaderCode(ManifestResourceLoader.LoadTextFile(
                                                @"Resources\Label.vert"), ShaderType.VertexShader);
            shaderCodes[1] = new ShaderCode(ManifestResourceLoader.LoadTextFile(
                                                @"Resources\Label.frag"), ShaderType.FragmentShader);

            var map = new AttributeMap();

            map.Add("in_Position", TextModel.strPosition);
            map.Add("in_UV", TextModel.strUV);

            var blendSwitch = new BlendSwitch(BlendingSourceFactor.SourceAlpha, BlendingDestinationFactor.One);

            var renderer = new LabelRenderer(model, shaderCodes, map, blendSwitch);

            renderer.blendSwitch = blendSwitch;
            renderer.fontTexture = fontTexture;
            renderer.LabelHeight = labelHeight;

            return(renderer);
        }
예제 #5
0
        public static ParticleNode Create(int particleCount)
        {
            IShaderProgramProvider updateProvider, renderProvider;
            {
                var vs = new VertexShader(updateVert);
                var feedbackVaryings = new string[] { outPosition, outVelocity };
                updateProvider = new ShaderArray(feedbackVaryings, ShaderProgram.BufferMode.Separate, vs);
            }
            {
                var vs = new VertexShader(renderVert);
                var gs = new GeometryShader(renderGeom);
                var fs = new FragmentShader(renderFrag);
                renderProvider = new ShaderArray(vs, gs, fs);
            }
            RenderMethodBuilder updateBuilder, updateBuilder2, renderBuilder, renderBuilder2;
            var blend = new BlendSwitch(BlendEquationMode.Add, BlendSrcFactor.One, BlendDestFactor.One);
            {
                var map = new AttributeMap();
                map.Add(inPosition, ParticleModel.inPosition);
                map.Add(inVelocity, ParticleModel.inVelocity);
                updateBuilder = new RenderMethodBuilder(updateProvider, map);
            }
            {
                var map = new AttributeMap();
                map.Add(inPosition, ParticleModel.inPosition2);
                map.Add(inVelocity, ParticleModel.inVelocity2);
                updateBuilder2 = new RenderMethodBuilder(updateProvider, map);
            }
            {
                var map = new AttributeMap();
                map.Add(inPosition, ParticleModel.inPosition);
                map.Add(inVelocity, ParticleModel.inVelocity);
                renderBuilder = new RenderMethodBuilder(renderProvider, map, blend);
            }
            {
                var map = new AttributeMap();
                map.Add(inPosition, ParticleModel.inPosition2);
                map.Add(inVelocity, ParticleModel.inVelocity2);
                renderBuilder2 = new RenderMethodBuilder(renderProvider, map, blend);
            }

            var model = new ParticleModel(particleCount);
            var node  = new ParticleNode(model, updateBuilder, updateBuilder2, renderBuilder, renderBuilder2);

            node.Initialize();

            return(node);
        }
예제 #6
0
        public static RectGlassNode Create(float width, float height)
        {
            var model = new RectGlassModel(width, height);
            var vs    = new VertexShader(vert);
            var fs    = new FragmentShader(frag);
            var array = new ShaderArray(vs, fs);
            var map   = new AttributeMap();

            map.Add("inPosition", RectGlassModel.strPosition);
            var blend     = new BlendSwitch(BlendingSourceFactor.SourceAlpha, BlendingDestinationFactor.OneMinusSourceAlpha);
            var depthMask = new DepthMaskSwitch(false);
            var builder   = new RenderMethodBuilder(array, map, blend, depthMask);
            var node      = new RectGlassNode(model, builder);

            node.Blend     = blend;
            node.ModelSize = new vec3(width, height, 0);
            node.Initialize();

            return(node);
        }
예제 #7
0
        public static AccumulationNode Create()
        {
            var model = new Sphere();
            RenderMethodBuilder renderBuilder;
            {
                var vs       = new VertexShader(renderVert);
                var fs       = new FragmentShader(renderFrag);
                var provider = new ShaderArray(vs, fs);
                var map      = new AttributeMap();
                map.Add("inPosition", Sphere.strPosition);
                map.Add("inColor", Sphere.strColor);
                var blend = new BlendSwitch(BlendingSourceFactor.SourceAlpha, BlendingDestinationFactor.OneMinusSourceAlpha);
                renderBuilder = new RenderMethodBuilder(provider, map);
            }
            var node = new AccumulationNode(model, renderBuilder);

            node.ModelSize = model.Size;
            node.Initialize();

            return(node);
        }
예제 #8
0
        public static StaticSlicesNode Create(int sliceCount, Texture texture1D, Texture texture3D)
        {
            var vs    = new VertexShader(vertexCode);
            var fs    = new FragmentShader(fragmentCode);
            var array = new ShaderArray(vs, fs);
            var map   = new AttributeMap();

            map.Add("inPosition", StaticSlicesModel.strPosition);
            map.Add("inTexCoord", StaticSlicesModel.strTexCoord);
            //var depthTestSwitch = new DepthTestSwitch(false);
            //var polygonModeSwitch = new PolygonModeSwitch(PolygonMode.Line);
            var blendSwitch = new BlendSwitch(BlendEquationMode.Add, BlendSrcFactor.SrcAlpha, BlendDestFactor.OneMinusSrcAlpha);
            var builder     = new RenderMethodBuilder(array, map, blendSwitch);

            var model = new StaticSlicesModel(sliceCount);
            var node  = new StaticSlicesNode(model, builder);

            node.texture1D = texture1D;
            node.texture3D = texture3D;
            node.Initialize();

            return(node);
        }
예제 #9
0
 private void Form_Load(object sender, EventArgs e)
 {
     {
         this.glCanvas1.ShowSystemCursor = false;
     }
     {
         var camera = new Camera(
             new vec3(0, 0, 1), new vec3(0, 0, 0), new vec3(0, 1, 0),
             CameraType.Perspecitive, this.glCanvas1.Width, this.glCanvas1.Height);
         var rotator = new SatelliteManipulater();
         rotator.Bind(camera, this.glCanvas1);
         this.rotator           = rotator;
         this.scene             = new Scene(camera, this.glCanvas1);
         this.glCanvas1.Resize += this.scene.Resize;
     }
     {
         var labelRenderer = new LabelRenderer(1000, 640);
         labelRenderer.Text = "LABEL 1";
         labelRenderer.Initialize();
         labelRenderer.SetPosition(new vec3(1, 0, 0));
         SceneObject obj = labelRenderer.WrapToSceneObject("label 1");
         this.scene.RootObject.Children.Add(obj);
         this.blendSwitch1   = labelRenderer.SwitchList.Find(x => x is BlendSwitch) as BlendSwitch;
         this.labelRenderer1 = labelRenderer;
     }
     {
         var labelRenderer = new LabelRenderer(1000, 640);
         labelRenderer.Text = "LABEL 2";
         labelRenderer.Initialize();
         labelRenderer.SetPosition(new vec3(-1, 0, 0));
         SceneObject obj = labelRenderer.WrapToSceneObject("label 2");
         this.scene.RootObject.Children.Add(obj);
         this.blendSwitch2   = labelRenderer.SwitchList.Find(x => x is BlendSwitch) as BlendSwitch;
         this.labelRenderer2 = labelRenderer;
     }
 }
예제 #10
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="source"></param>
 /// <param name="dest"></param>
 public BlendingGroupNode(BlendingSourceFactor source, BlendingDestinationFactor dest)
 {
     this.blending = new BlendSwitch(source, dest);
 }
예제 #11
0
 void FormMain_Load(object sender, EventArgs e)
 {
     {
         var camera = new Camera(CameraType.Perspecitive, this.glCanvas1.Width, this.glCanvas1.Height);
         camera.Position = new vec3(0, 0, (float)(Earth.revolutionRadius * 1.1));
         camera.Target   = new vec3(0, 0, 0);
         camera.UpVector = new vec3(0, 1, 0);
         IPerspectiveViewCamera perspecitve = camera;
         perspecitve.Near = 1;
         perspecitve.Far  = Earth.revolutionRadius * 2;
         var rotator = new SatelliteRotator(camera);
         this.camera  = camera;
         this.rotator = rotator;
     }
     {
         const int   latitude         = 180;                     //从南到北,纬度共有180°
         const int   hour             = 24;                      //24小时,24个时区
         const int   longitudePerHour = 15;                      // 每个时区占有的经度为15°
         const int   longitude        = hour * longitudePerHour; // 从东到西,经度共有360°
         IBufferable bufferable       = new CelestialBody((float)Earth.radius, latitude, longitude);
         var         shaderCodes      = new ShaderCode[2];
         shaderCodes[0] = new ShaderCode(File.ReadAllText(@"shaders\CelestialBody.vert"), ShaderType.VertexShader);
         shaderCodes[1] = new ShaderCode(File.ReadAllText(@"shaders\CelestialBody.frag"), ShaderType.FragmentShader);
         var map = new PropertyNameMap();
         map.Add("inPosition", CelestialBody.strPosition);
         map.Add("inUV", CelestialBody.strUV);
         var earthRenderer = new PickableRenderer(bufferable, shaderCodes, map, CelestialBody.strPosition);
         earthRenderer.Initialize();
         earthRenderer.Name = "Earth 地球";
         this.earthRenderer = earthRenderer;
     }
     {
         // Ecliptic: 黄道
         IBufferable bufferable  = new Circle((float)Earth.revolutionRadius, 360);
         var         shaderCodes = new ShaderCode[2];
         shaderCodes[0] = new ShaderCode(File.ReadAllText(@"shaders\Circle.vert"), ShaderType.VertexShader);
         shaderCodes[1] = new ShaderCode(File.ReadAllText(@"shaders\Circle.frag"), ShaderType.FragmentShader);
         var map = new PropertyNameMap();
         map.Add("inPosition", Circle.strPosition);
         var eclipticRenderer = new Renderer(bufferable, shaderCodes, map);
         eclipticRenderer.Initialize();
         eclipticRenderer.Name = "Ecliptic 黄道";
         this.eclipticRenderer = eclipticRenderer;
     }
     {
         var glAxis = new GLAxis(AnchorStyles.Left | AnchorStyles.Bottom,
                                 new Padding(5, 5, 5, 5), new Size(100, 100), -100, 100);
         glAxis.Initialize();
         this.glAxis = glAxis;
     }
     {
         var uiRoot = new GLControl(this.glCanvas1.Size, -100, 100);
         uiRoot.Initialize();
         this.uiRoot = uiRoot;
     }
     {
         this.uiRoot.Controls.Add(this.glAxis);
     }
     {
         var earthColorTexture = new sampler2D();
         var bitmap            = new Bitmap(@"Images\earth-color-map-10800-5400.jpg");
         earthColorTexture.Initialize(bitmap);
         bitmap.Dispose();
         this.earthColorTexture = earthColorTexture;
     }
     {
         this.eclipticRenderer.SetUniform("color", new vec4(1.0f, 1.0f, 0.0f, 0.1f));
         this.eclipticRenderer.SwitchList.Add(new PolygonModeSwitch(PolygonModes.Lines));
     }
     {
         this.earthRenderer.SetUniform("colorTexture", new samplerValue(BindTextureTarget.Texture2D, this.earthColorTexture.Id, OpenGL.GL_TEXTURE0));
         this.earthRenderer.SwitchList.Add(new CullFaceSwitch());
     }
     {
         var earth = new Earth();
         this.earth = earth;
         this.thingList.Add(earth);
     }
     {
         var blendSwitch = new BlendSwitch();
         this.blendSwitch = blendSwitch;
     }
     {
         var frmPropertyGrid = new FormProperyGrid();
         frmPropertyGrid.DisplayObject(this);
         frmPropertyGrid.Show();
     }
     {
         var frmPropertyGrid = new FormProperyGrid();
         frmPropertyGrid.DisplayObject(this.earthRenderer);
         frmPropertyGrid.Show();
     }
     {
         var frmPropertyGrid = new FormProperyGrid();
         frmPropertyGrid.DisplayObject(this.eclipticRenderer);
         frmPropertyGrid.Show();
     }
     {
         this.TimeSpeed = 14400;
     }
 }