public static BRDFNode Create(Texture texBRDF) { var model = new QuadModel(); var vs = new VertexShader(vertexCode); var fs = new FragmentShader(fragmentCode); var array = new ShaderArray(vs, fs); var map = new AttributeMap(); map.Add("aPos", QuadModel.strPosition); map.Add("aTexCoords", QuadModel.strTexCoord); var builder = new RenderMethodBuilder(array, map); var node = new BRDFNode(model, builder); node.ModelSize = new vec3(2, 2, 2); node.texBRDF = texBRDF; node.Initialize(); return(node); }
private void FormMain_Load(object sender, EventArgs e) { var position = new vec3(-0.2f, 0, 1) * 14; var center = new vec3(0, 0, 0); var up = new vec3(0, 1, 0); var camera = new Camera(position, center, up, CameraType.Perspective, this.winGLCanvas1.Width, this.winGLCanvas1.Height); this.scene = new Scene(camera); var rootNode = new GroupNode(); this.scene.RootNode = rootNode; Texture texBRDF = LoadBRDFTexture(); texBRDF.TextureUnitIndex = 2; Texture prefilterMap = LoadPrefilterMap(); prefilterMap.TextureUnitIndex = 1; Texture irradianceMap = LoadIrradianceMap(); irradianceMap.TextureUnitIndex = 0; Texture envCubemap = LoadEnvCubeMap(); Texture texHDR = LoadHDRTexture("newport_loft.hdr"); { var node = CubemapNode.Create(envCubemap, texHDR); rootNode.Children.Add(node); } { var node = IrradianceNode.Create(irradianceMap, envCubemap); rootNode.Children.Add(node); } { var node = BRDFNode.Create(texBRDF); rootNode.Children.Add(node); } { var sphere = new Sphere2();//(1, 40, 80); var filename = Path.Combine(System.Windows.Forms.Application.StartupPath, "sphere2.obj_"); sphere.DumpObjFile(filename, "sphere2"); var parser = new ObjVNFParser(false, true); ObjVNFResult result = parser.Parse(filename); if (result.Error != null) { Console.WriteLine("Error: {0}", result.Error); } else { ObjVNFMesh mesh = result.Mesh; var model = new ObjVNF(mesh); // render rows*column number of spheres with varying metallic/roughness values scaled by rows and columns respectively for (int row = 0; row < nrRows; ++row) { for (int col = 0; col < nrColumns; ++col) { var node = PBRNode.Create(model, model.GetSize(), ObjVNF.strPosition, ObjVNF.strTexCoord, ObjVNF.strNormal); node.IrradianceMap = irradianceMap; node.PrefilterMap = prefilterMap; node.texBRDF = texBRDF; node.Metallic = (float)row / (float)nrRows; // we clamp the roughness to 0.025 - 1.0 as perfectly smooth surfaces (roughness of 0.0) tend to look a bit off // on direct lighting. node.Roughness = glm.clamp((float)col / (float)nrColumns, 0.05f, 1.0f); node.WorldPosition = new vec3( (col - (nrColumns / 2)) * spacing, (row - (nrRows / 2)) * spacing, 0.0f); rootNode.Children.Add(node); } } } } { var backgroundNode = BackgroundNode.Create(envCubemap); rootNode.Children.Add(backgroundNode); } var list = new ActionList(); var transformAction = new TransformAction(scene); list.Add(transformAction); var renderAction = new RenderAction(scene); list.Add(renderAction); this.actionList = list; var manipulater = new FirstPerspectiveManipulater(); manipulater.Bind(camera, this.winGLCanvas1); }