private static Texture LoadNormalMap(Engine engine, byte[] normals) { var imageResult = ImageResult.FromMemory(normals, ColorComponents.RedGreenBlue); var normalMap = TextureBuilder.Create() .WithWidth(imageResult.Width) .WithHeight(imageResult.Height) .WithLevels(0xFF) .WithFormat(TextureFormat.Rgb8) .Build(engine); var descriptor = new PixelBufferDescriptor(imageResult.Data, PixelDataFormat.Rgb, PixelDataType.UByte); normalMap.SetImage(engine, 0, descriptor); normalMap.GenerateMipmaps(engine); return(normalMap); }
private static Texture CreateSplatTexture(Engine engine) { // To generate a Gaussian splat, create a single-channel 3x3 texture with a bright pixel in // its center, then magnify it using a Gaussian filter kernel. var splat = new LinearImage(3, 3, 1); splat.SetPixelData(1, 1, 0.25f); splat = ImageSampler.ResampleImage(splat, TEXTURE_SIZE, TEXTURE_SIZE, ImageSamplerFilter.GaussianScalars); var buffer = new PixelBufferDescriptor(splat, PixelDataFormat.R, PixelDataType.Float); var texture = TextureBuilder.Create() .WithWidth(TEXTURE_SIZE) .WithHeight(TEXTURE_SIZE) .WithLevels(1) .WithSampler(TextureSamplerType.Texture2d) .WithFormat(TextureFormat.R32F) .Build(engine); texture.SetImage(engine, 0, buffer); return(texture); }
static void Main(string[] args) { Texture texture = null; Skybox skybox = null; VertexBuffer vertexBuffer = null; IndexBuffer indexBuffer = null; Material material = null; MaterialInstance materialInstance = null; Camera camera = null; int cameraEntity = -1; int renderable = -1; var app = new Application( new WindowConfig() { Title = "texturedquad" }, new ApplicationConfig() ); app.Setup = (engine, view, scene) => { var path = Path.Combine(app.RootAssetPath, "textures/Moss_01/Moss_01_Color.png"); if (!File.Exists(path)) { Console.WriteLine("The texture {0} does not exist", path); Environment.Exit(1); } using (var stream = File.OpenRead(path)) { var imageResult = ImageResult.FromStream(stream, ColorComponents.RedGreenBlueAlpha); Console.WriteLine("Loaded texture: {0}x{1}", imageResult.Width, imageResult.Height); var pixelBuffer = new PixelBufferDescriptor(imageResult.Data, PixelDataFormat.Rgba, PixelDataType.UByte); texture = TextureBuilder.Create() .WithWidth(imageResult.Width) .WithHeight(imageResult.Height) .WithLevels(1) .WithSampler(TextureSamplerType.Texture2d) .WithFormat(TextureFormat.Rgba8) .Build(engine); texture.SetImage(engine, 0, pixelBuffer); } // Set up view skybox = SkyboxBuilder.Create() .WithColor(new Color(0.1f, 0.125f, 0.25f, 1.0f)) .Build(engine); scene.Skybox = skybox; cameraEntity = EntityManager.Create(); camera = engine.CreateCamera(cameraEntity); view.PostProcessingEnabled = false; view.Camera = camera; // Create quad renderable var vbo = new VertexBufferObject(); vbo.Write(new Vector2(-1, -1)); vbo.Write(new Vector2(0, 0)); vbo.Write(new Vector2(1, -1)); vbo.Write(new Vector2(1, 0)); vbo.Write(new Vector2(-1, 1)); vbo.Write(new Vector2(0, 1)); vbo.Write(new Vector2(1, 1)); vbo.Write(new Vector2(1, 1)); vertexBuffer = VertexBufferBuilder.Create() .WithVertexCount(4) .WithBufferCount(1) .WithAttribute(VertexAttribute.Position, 0, ElementType.Float2, 0, 16) .WithAttribute(VertexAttribute.Uv0, 0, ElementType.Float2, 8, 16) .Build(engine); vertexBuffer.SetBufferAt(engine, 0, vbo); var sampleData = new SampleDataLoader(); indexBuffer = IndexBufferBuilder.Create() .WithIndexCount(6) .WithBufferType(IndexType.UShort) .Build(engine); indexBuffer.SetBuffer(engine, QUAD_INDICES); material = MaterialBuilder.Create() .WithPackage(sampleData.LoadBakedTexture()) .Build(engine); var sampler = new TextureSampler(SamplerMinFilter.Linear, SamplerMagFilter.Linear); materialInstance = material.CreateInstance(); materialInstance.SetParameter("albedo", texture, sampler); renderable = EntityManager.Create(); RenderableBuilder.Create() .WithBoundingBox( new Box( new Vector3(-1, -1, -1), new Vector3(1, 1, 1) ) ) .WithMaterial(0, materialInstance) .WithGeometry(0, PrimitiveType.Triangles, vertexBuffer, indexBuffer, 0, 6) .WithCulling(false) .WithReceiveShadows(false) .WithCastShadows(false) .Build(engine, renderable); scene.AddEntity(renderable); }; app.Cleanup = (engine, view, scene) => { engine.Destroy(skybox); engine.Destroy(renderable); engine.Destroy(materialInstance); engine.Destroy(material); engine.Destroy(texture); engine.Destroy(vertexBuffer); engine.Destroy(indexBuffer); engine.DestroyCameraComponent(cameraEntity); EntityManager.Destroy(cameraEntity); }; app.Animate = (engine, view, now) => { var zoom = 2.0f + 2.0f * MathF.Sin(now); var width = view.Viewport.Width; var height = view.Viewport.Height; var aspect = (float)width / (float)height; camera.SetProjection(Projection.Ortho, -aspect * zoom, aspect * zoom, -zoom, zoom, -1, 1 ); }; app.Run(); }
private bool LoadCubemapLevel(ref Texture texture, out PixelBufferDescriptor outBuffer, out FaceOffsets outOffsets, string path, int level, string levelPrefix) { int size = 0; int numLevels = 1; outBuffer = null; outOffsets = new FaceOffsets(); { string faceName = levelPrefix + FaceSuffix[0] + ".rgb32f"; string facePath = Path.Combine(path, faceName); if (!File.Exists(facePath)) { Console.WriteLine("The face {0} does not exist", facePath); return(false); } var imageInfo = ImageInfo.FromStream(File.OpenRead(facePath)); if (imageInfo.Value.Width != imageInfo.Value.Height) { Console.WriteLine("width != height"); return(false); } size = imageInfo.Value.Width; numLevels = 1; if (string.IsNullOrEmpty(levelPrefix)) { numLevels = (int)MathF.Log2(size) + 1; } if (level == 0) { texture = TextureBuilder.Create() .WithWidth(size) .WithHeight(size) .WithLevels(numLevels) .WithFormat(TextureFormat.R11F_G11F_B10F) .WithSampler(TextureSamplerType.Cubemap) .Build(_engine); } } // RGB_10_11_11_REV encoding: 4 bytes per pixel var faceSize = size * size * Marshal.SizeOf <uint>(); FaceOffsets offsets = new FaceOffsets(); byte[] pixelBuffer = new byte[faceSize * 6]; var success = true; for (var j = 0; j < 6; j++) { outOffsets[j] = faceSize * j; string faceName = levelPrefix + FaceSuffix[j] + ".rgb32f"; string facePath = Path.Combine(path, faceName); if (!File.Exists(facePath)) { Console.WriteLine("The face {0} does not exist", facePath); success = false; break; } var imageResult = ImageResult.FromStream(File.OpenRead(facePath), ColorComponents.RedGreenBlueAlpha); if (imageResult.Width != imageResult.Height || imageResult.Width != size) { Console.WriteLine("Face {0} has a wrong size {1}x{2}, instead of {3}x{3}", faceName, imageResult.Width, imageResult.Height, size); success = false; break; } if (imageResult.SourceComp != ColorComponents.RedGreenBlueAlpha) { Console.WriteLine("Could not decode face {0}", faceName); success = false; break; } Array.Copy(imageResult.Data, 0, pixelBuffer, offsets[j], imageResult.Width * imageResult.Height * Marshal.SizeOf <uint>()); } if (!success) { return(false); } outBuffer = new PixelBufferDescriptor(pixelBuffer, PixelDataFormat.Rgb, PixelDataType.UInt_10F_11F_11F_Rev); return(true); }