public PrimitivesExample(Renderer renderer) { // Create the shaders Fe.Shader vertexShader, fragmentShader; switch (renderer.GetRendererType()) { case Fe.RendererType.OpenGL: vertexShader = new Fe.Shader(Fe.ShaderType.Vertex, File.ReadAllText("default.vert")); fragmentShader = new Fe.Shader(Fe.ShaderType.Fragment, File.ReadAllText("default.frag")); break; default: throw new System.Exception("Unknown backend renderer type"); } vs = vertexShader; fs = fragmentShader; program = new ShaderProgram(vs, fs); // Vertices that make up a cube. PosColorVertex[] vertices = { new PosColorVertex() { x = 0, y = 0, z = 0 }, new PosColorVertex() { x = 0, y = 1, z = 0 }, new PosColorVertex() { x = 1, y = 0, z = 0 }, new PosColorVertex() { x = 1, y = 1, z = 0 }, }; // Create vertex buffer for our cube this._vb = new Fe.VertexBuffer <PosColorVertex>(vertices); Fe.Uniform colourUniform = new Fe.Uniform("colour", Fe.UniformType.Uniform4f); defaultUniforms = new Fe.UniformBuffer(); defaultUniforms.Set(colourUniform, 1.0f, 1.0f, 1.0f, 1.0f); }
static void Main(string[] args) { var canvas = new ExampleBase.GraphicsCanvas(); // Create the renderer var renderer = new Fe.Renderer(); // Set the handle from our form so we let Fe create context/devices as appropriate. renderer.SetWindowHandle(canvas.Handle); // Initialise the renderer renderer.Init(); // Create geometry layer command bucker var geometryBucket = renderer.AddCommandBucket(UInt16.MaxValue); // Create the shaders Fe.Shader vertexShader, fragmentShader; switch (renderer.GetRendererType()) { case Fe.RendererType.OpenGL: vertexShader = new Fe.Shader(Fe.ShaderType.Vertex, File.ReadAllText("default.vert")); fragmentShader = new Fe.Shader(Fe.ShaderType.Fragment, File.ReadAllText("default.frag")); break; default: throw new Exception("Unknown backend renderer type"); } Fe.ShaderProgram program = new ShaderProgram(vertexShader, fragmentShader); // Build plane data var plane = new Fe.Extra.Geometry.Plane(30, 30, 30, 30); PosColorVertex[] vertices = new PosColorVertex[plane.Vertices.Length / 3]; Random rand = new Random(); int i = 0; int offset = 0; for (i = 0; i < vertices.Length; i++) { vertices[i].x = plane.Vertices[offset]; vertices[i].y = plane.Vertices[offset + 1]; vertices[i].z = plane.Vertices[offset + 2]; vertices[i].abgr = (uint)(rand.Next(1 << 30)) << 2 | (uint)(rand.Next(1 << 2));; offset += 3; } // Create vertex buffer for our cube var vb = new Fe.VertexBuffer <PosColorVertex>(vertices, true); var ib = new Fe.IndexBuffer(plane.Indices); // Create shared uniforms Fe.Uniform projectionUniform = new Fe.Uniform("projectionMatrix", Fe.UniformType.Matrix4x4f); Fe.UniformBuffer sharedUniforms = new Fe.UniformBuffer(); // Turn off face culling. var rs = new RasteriserState(CullMode.None); Stopwatch frameTimer = Stopwatch.StartNew(); double frameTime = 0; float rotTime = 0.0f; float waveyTime = 0.0f; canvas.Title = "Dynamic vertex buffer update example"; void Resize(int width, int height) { // Set up a projection matrix var projectionMatrix = Nml.Matrix4x4.PerspectiveProjectionRH(Nml.Common.Pi / 4, (float)width / (float)height, 0.1f, 100.0f); projectionMatrix *= Nml.Matrix4x4.Translate(0, 0, -50.0f); sharedUniforms.Set(projectionUniform, projectionMatrix.ToArray()); renderer.Reset(width, height); } // Force an Initial resize, you could handle this with some event on your window if you wanted. Resize(canvas.Width, canvas.Height); void Cleanup() { // Kill off the renderer and clean up all underlying resources. renderer.Dispose(); } void Update() { frameTime = frameTimer.Elapsed.TotalMilliseconds; frameTimer.Restart(); // Increase the animation rotTime += (float)frameTime * 0.0010f; waveyTime += (float)frameTime * 0.01f; var cubeCommand = geometryBucket.AddCommand(1); cubeCommand.SetShaderProgram(program); cubeCommand.SetVertexBuffer(vb); cubeCommand.SetIndexBuffer(ib); cubeCommand.SetSharedUniforms(sharedUniforms); cubeCommand.SetRasteriserState(rs); // Generate new vertice positionsd for (i = 0; i < vertices.Length; i++) { float newPos = (float)Math.Sin(waveyTime + i) * 1.5f; vertices[i].z = newPos; } // Update the buffer vb.SetData(vertices); Nml.Matrix4x4 planeTransform = Nml.Matrix4x4.Identity; // Rotate it to make look pretty Nml.Quaternion rotQuat; Nml.Quaternion.RotateEuler(0, rotTime * 0.37f, rotTime * 0.13f, out rotQuat); Nml.Quaternion.GetMatrix4x4(ref rotQuat, out planeTransform); cubeCommand.SetTransform(planeTransform.ToArray()); // Submit current commands queued to the renderer for rendering. renderer.EndFrame(); } canvas.Resize += () => { Resize(canvas.Width, canvas.Height); }; canvas.Closing += () => { Cleanup(); }; ExampleBase.Application.Run(canvas, () => { Update(); }); }
public TexturesExample(Renderer renderer) { // Create the shaders Fe.Shader vertexShader, fragmentShader; switch (renderer.GetRendererType()) { case Fe.RendererType.OpenGL: vertexShader = new Fe.Shader(Fe.ShaderType.Vertex, File.ReadAllText("withtexture.vert")); fragmentShader = new Fe.Shader(Fe.ShaderType.Fragment, File.ReadAllText("withtexture.frag")); break; default: throw new System.Exception("Unknown backend renderer type"); } vs = vertexShader; fs = fragmentShader; program = new ShaderProgram(vs, fs); var cube = new Fe.Extra.Geometry.Cube(); // Vertices that make up a cube. PosNormalTexCoordVertex[] vertices = new PosNormalTexCoordVertex[cube.Vertices.Length / 3]; int i = 0; int vertOffset = 0; int texOffset = 0; for (i = 0; i < vertices.Length; i++) { vertices[i].x = cube.Vertices[vertOffset]; vertices[i].y = cube.Vertices[vertOffset + 1]; vertices[i].z = cube.Vertices[vertOffset + 2]; vertices[i].normx = cube.Normals[vertOffset]; vertices[i].normy = cube.Normals[vertOffset + 1]; vertices[i].normz = cube.Normals[vertOffset + 2]; vertices[i].texcoord0 = cube.UVs[texOffset]; vertices[i].texcoord1 = cube.UVs[texOffset + 1]; vertices[i].abgr = 0xFF00FFFF; vertOffset += 3; texOffset += 2; } // For demo purposes lets up one side of of the cubes uv's to show sampler behaviour. vertices[1].texcoord0 = 5.0f; vertices[2].texcoord1 = 5.0f; vertices[3].texcoord0 = 5.0f; vertices[3].texcoord1 = 5.0f; // Create vertex buffer for our cube this._vb = new Fe.VertexBuffer <PosNormalTexCoordVertex>(vertices); // Create index buffer this._ib = new Fe.IndexBuffer(cube.Indices); rasteriserState = new RasteriserState(CullMode.Clockwise); colourMapUniform = new Fe.Uniform("colourMap", Fe.UniformType.Uniform1f); // Create a texture sampler state textureSampler = new TextureSampler(); textureSampler.AddressU = TextureAddressMode.Repeat; textureSampler.AddressV = TextureAddressMode.Repeat; // Load example image we're going to apply using (Image image = Image.Load(@"..\assets\lilly.jpg")) { texture = new Fe.Texture2d <Color>(image.Width, image.Height, SampleFormat.RGBA8, image.Pixels); } }
public TranslucencySortExample(Renderer renderer) { // Create the shaders Fe.Shader vertexShader, fragmentShader; switch (renderer.GetRendererType()) { case Fe.RendererType.OpenGL: vertexShader = new Fe.Shader(Fe.ShaderType.Vertex, File.ReadAllText("default.vert")); fragmentShader = new Fe.Shader(Fe.ShaderType.Fragment, File.ReadAllText("default.frag")); break; default: throw new System.Exception("Unknown backend renderer type"); } vs = vertexShader; fs = fragmentShader; program = new ShaderProgram(vs, fs); // BlendState for alpha transparency. this._bs = new Fe.BlendState(true, Fe.BlendFactor.SourceAlpha, Fe.BlendFactor.InvertSourceAlpha, Fe.BlendOperation.Add, Fe.BlendFactor.One, Fe.BlendFactor.Zero, Fe.BlendOperation.Add); // Vertices that make up a cube. PosColorVertex[] vertices = { new PosColorVertex(-0.25f, 0.25f, 0.25f, 0xbbFF0000), new PosColorVertex(0.25f, 0.25f, 0.25f, 0xbbFF0000), new PosColorVertex(-0.25f, -0.25f, 0.25f, 0xbbFF0000), new PosColorVertex(0.25f, -0.25f, 0.25f, 0xbbFF0000), new PosColorVertex(-0.25f, 0.25f, -0.25f, 0xbbFF0000), new PosColorVertex(0.25f, 0.25f, -0.25f, 0xbbFF0000), new PosColorVertex(-0.25f, -0.25f, -0.25f, 0xbbFF0000), new PosColorVertex(0.25f, -0.25f, -0.25f, 0xbbFF0000), }; // Indices that make up a cube. uint[] indexPositions = { 0, 1, 2, 1, 3, 2, 4, 6, 5, 5, 6, 7, 0, 2, 4, 4, 2, 6, 1, 5, 3, 5, 7, 3, 0, 4, 1, 4, 5, 1, 2, 3, 6, 6, 3, 7, }; // Create vertex buffer for our cube this._vb = new Fe.VertexBuffer <PosColorVertex>(vertices); this._ib = new Fe.IndexBuffer(indexPositions); Fe.Uniform colourUniform = new Fe.Uniform("colour", Fe.UniformType.Uniform4f); _opaque = new Fe.UniformBuffer(); _opaque.Set(colourUniform, 0.0f, 1.0f, 0.0f, 1.0f); _translucent = new Fe.UniformBuffer(); _translucent.Set(colourUniform, 1.0f, 0.0f, 0.0f, 0.4f); }