/// <summary> /// Handles the OpenGLDraw event of the openGLControl control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="RenderEventArgs"/> instance containing the event data.</param> public void openGLControl_OpenGLDraw(object sender, RenderEventArgs e) { // Get the OpenGL object. gl = openGLControl.OpenGL; // Clear the color and depth buffer. gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT); // Load the identity matrix. gl.LoadIdentity(); // Rotate around the Y axis. //gl.Rotate(rotation, 0.0f, 1.0f, 0.0f); cord = ComInput.Coordinates.Instance; this.ModelRotater(gl); gl.Enable(OpenGL.GL_BLEND); gl.BlendFunc(OpenGL.GL_SRC_ALPHA, OpenGL.GL_ONE_MINUS_SRC_ALPHA); // Draw a coloured parallelepiped. gl.Begin(OpenGL.GL_QUADS); gl.Color(0.0f, 1.0f, 0.0f); gl.Vertex(-2.0f, -0.25f, -1.0f); gl.Color(0.0f, 1.0f, 0.0f); gl.Vertex(2.0f, -0.25f, -1.0f); gl.Color(0.0f, 1.0f, 0.0f); gl.Vertex(2.0f, 0.25f, -1.0f); gl.Color(0.0f, 1.0f, 0.0f); gl.Vertex(-2.0f, 0.25f, -1.0f); //------------------------------------- gl.Color(1.0f, 0.0f, 0.0f); gl.Vertex(-2.0f, -0.25f, -1.0f); gl.Color(1.0f, 0.0f, 0.0f); gl.Vertex(-2.0f, -0.25f, 1.0f); gl.Color(1.0f, 0.0f, 0.0f); gl.Vertex(-2.0f, 0.25f, 1.0f); gl.Color(1.0f, 0.0f, 0.0f); gl.Vertex(-2.0f, 0.25f, -1.0f); //------------------------------------- gl.Color(0.0f, 1.0f, 0.0f); gl.Vertex(-2.0f, -0.25f, 1.0f); gl.Color(0.0f, 1.0f, 0.0f); gl.Vertex(2.0f, -0.25f, 1.0f); gl.Color(0.0f, 1.0f, 0.0f); gl.Vertex(2.0f, 0.25f, 1.0f); gl.Color(0.0f, 1.0f, 0.0f); gl.Vertex(-2.0f, 0.25f, 1.0f); //------------------------------------- gl.Color(1.0f, 0.0f, 0.0f); gl.Vertex(2.0f, -0.25f, 1.0f); gl.Color(1.0f, 0.0f, 0.0f); gl.Vertex(2.0f, -0.25f, -1.0f); gl.Color(1.0f, 0.0f, 0.0f); gl.Vertex(2.0f, 0.25f, -1.0f); gl.Color(1.0f, 0.0f, 0.0f); gl.Vertex(2.0f, 0.25f, 1.0f); //------------------------------------- gl.Color(0.0f, 1.0f, 1.0f); gl.Vertex(-2.0f, 0.25f, -1.0f); gl.Color(0.0f, 1.0f, 1.0f); gl.Vertex(2.0f, 0.25f, -1.0f); gl.Color(0.0f, 1.0f, 1.0f); gl.Vertex(2.0f, 0.25f, 1.0f); gl.Color(0.0f, 1.0f, 1.0f); gl.Vertex(-2.0f, 0.25f, 1.0f); //-------------------------------------- gl.Color(0.0f, 0.0f, 1.0f); gl.Vertex(-2.0f, -0.25f, -1.0f); gl.Color(0.0f, 0.0f, 1.0f); gl.Vertex(2.0f, -0.25f, -1.0f); gl.Color(0.0f, 0.0f, 1.0f); gl.Vertex(2.0f, -0.25f, 1.0f); gl.Color(0.0f, 0.0f, 1.0f); gl.Vertex(-2.0f, -0.25f, 1.0f); gl.End(); //-------------------Angle indicator prototype is here---------------------------------------------- gl.LoadIdentity(); gl.Rotate(cord.getX(), 1.0f, 0.0f, 0.0f); gl.Begin(OpenGL.GL_TRIANGLES); gl.Vertex(0.0f, 2.75f, 0.0f); gl.Vertex(0.25f, 3.25f, 0.0f); gl.Vertex(-0.25f, 3.25f, 0.0f); gl.End(); gl.LoadIdentity(); gl.Rotate(cord.getZ(), 0.0f, 1.0f, 0.0f); gl.Begin(OpenGL.GL_TRIANGLES); gl.Vertex(0.0f, 0.0f, 2.75f); gl.Vertex(0.0f, 0.25f, 3.25f); gl.Vertex(0.0f, -0.25f, 3.25f); gl.End(); gl.LoadIdentity(); gl.Rotate(cord.getY(), 0.0f, 0.0f, 1.0f); gl.Begin(OpenGL.GL_TRIANGLES); gl.Vertex(2.75f, 0.0f, 0.0f); gl.Vertex(3.25f, 0.0f, 0.25f); gl.Vertex(3.25f, 0.0f, -0.25f); gl.End(); //------------------Circles of planes is here----------------------------------------------- gl.LoadIdentity(); gl.Begin(OpenGL.GL_LINE_LOOP); for(int i = 0; i < 200; i++) { float theta = 2.0f * 3.1415926f * (float)i / 200f;//get the current angle float x = 3f * (float)System.Math.Cos(theta);//calculate the x component float y = 3f * (float)System.Math.Sin(theta);//calculate the y component gl.Color(0.0f, 1.0f, 0.0f); gl.Vertex(0f, y + 0.0f, x + 0.0f);//output vertex } gl.End(); gl.Begin(OpenGL.GL_LINE_LOOP); for (int i = 0; i < 200; i++) { float theta = 2.0f * 3.1415926f * (float)i / 200f;//get the current angle float x = 3f * (float)System.Math.Cos(theta);//calculate the x component float y = 3f * (float)System.Math.Sin(theta);//calculate the y component gl.Vertex(x + 0.0f, 0.0f, y + 0.0f);//output vertex } gl.End(); gl.Begin(OpenGL.GL_LINE_LOOP); for (int i = 0; i < 200; i++) { float theta = 2.0f * 3.1415926f * (float)i / 200f;//get the current angle float x = 3f * (float)System.Math.Cos(theta);//calculate the x component float y = 3f * (float)System.Math.Sin(theta);//calculate the y component gl.Vertex(x + 0.0f, y + 0.0f, 0.0f);//output vertex } gl.End(); /* //--------------Coordinate axis's is here-------------------------------------------- gl.LoadIdentity(); gl.Begin(OpenGL.GL_LINE_STRIP); gl.Color(1.0f, 1.0f, 1.0f); gl.Vertex(-4.0f, 0.5f, 1.5f); gl.Vertex(2.5f, 0.5f, 1.5f); gl.Vertex(2.5f, 0.5f, -4.5f); gl.Vertex(2.5f, 0.5f, 1.5f); gl.Vertex(2.5f, 4.0f, 1.5f); gl.End(); */ //------------Shpere is here----------------------------- gl.LoadIdentity(); gl.Color(0.85f, 0.85f, 0.85f, 0.5f); gl.Begin(OpenGL.GL_QUADS); for (int i = 0; i < 1; i++) { this.draw_sphere(gl, 3); } gl.End(); //---------------3D Text prototype is here------------------- gl.LoadIdentity(); gl.Translate(0.0f, 3.5f, -3.0f); gl.Color(0.0f, 1.0f, 0.65f); gl.Rotate(270.0f, 0.0f, 1.0f, 0.0f); gl.DrawText3D("a", 0.2f, 1.0f, 0.1f, "osX: 0"); // Nudge the rotation. rotation += 2.0f; }
void IRenderable.Render(OpenGL gl, RenderMode renderMode) { if (positionBuffer != null && colorBuffer != null && radiusBuffer != null) { if (this.shaderProgram == null) { this.shaderProgram = InitShader(gl, renderMode); } if (this.vertexArrayObject == null) { CreateVertexArrayObject(gl, renderMode); } BeforeRendering(gl, renderMode); if (this.RenderGrid && this.vertexArrayObject != null) { gl.Enable(OpenGL.GL_BLEND); gl.BlendFunc(SharpGL.Enumerations.BlendingSourceFactor.SourceAlpha, SharpGL.Enumerations.BlendingDestinationFactor.OneMinusSourceAlpha); gl.BindVertexArray(this.vertexArrayObject[0]); gl.DrawArrays(OpenGL.GL_POINTS, 0, count); gl.BindVertexArray(0); gl.Disable(OpenGL.GL_BLEND); } AfterRendering(gl, renderMode); } }
/// <summary> /// Sets the attributes. /// </summary> /// <param name="gl">The OpenGL instance.</param> public override void SetAttributes(OpenGL gl) { if (enableAlphaTest.HasValue && alphaTestFunction.HasValue && alphaTestReferenceValue.HasValue) { gl.EnableIf(OpenGL.GL_ALPHA_TEST, enableAlphaTest.Value); gl.AlphaFunc(alphaTestFunction.Value, alphaTestReferenceValue.Value); } if (enableBlend.HasValue && blendingSourceFactor.HasValue && blendingDestinationFactor.HasValue) { gl.EnableIf(OpenGL.GL_BLEND, enableBlend.Value); gl.BlendFunc(blendingSourceFactor.Value, blendingDestinationFactor.Value); } if (enableDither.HasValue) { gl.EnableIf(OpenGL.GL_DITHER, enableDither.Value); } if (drawBufferMode.HasValue) { gl.DrawBuffer(drawBufferMode.Value); } if (enableLogicOp.HasValue && logicOp.HasValue) { gl.EnableIf(OpenGL.GL_COLOR_LOGIC_OP, enableLogicOp.Value); gl.LogicOp(logicOp.Value); } if (colorModeClearColor != null) { gl.ClearColor(colorModeClearColor.R, colorModeClearColor.G, colorModeClearColor.B, colorModeClearColor.A); } //todowritemask }
/// <summary> /// Initialises the supplied OpenGL instance for high quality rendering. /// </summary> /// <param name="gl">The OpenGL instance.</param> public static void InitialiseHighQuality(OpenGL gl) { // Set parameters that give us some high quality settings. gl.Enable(OpenGL.GL_DEPTH_TEST); gl.Enable(OpenGL.GL_NORMALIZE); gl.Enable(OpenGL.GL_LIGHTING); gl.Enable(OpenGL.GL_TEXTURE_2D); gl.ShadeModel(OpenGL.GL_SMOOTH); gl.LightModel(OpenGL.GL_LIGHT_MODEL_TWO_SIDE, OpenGL.GL_TRUE); gl.Enable(OpenGL.GL_BLEND); gl.BlendFunc(OpenGL.GL_SRC_ALPHA, OpenGL.GL_ONE_MINUS_SRC_ALPHA); }
void drawTree(SharpGL.OpenGL gl, double dx, double dy, double dz, int index)//树的函数 { gl.Enable(OpenGL.GL_BLEND); gl.BlendFunc(OpenGL.GL_SRC_ALPHA, OpenGL.GL_ONE_MINUS_SRC_ALPHA); gl.Enable(OpenGL.GL_ALPHA_TEST); gl.Enable(OpenGL.GL_TEXTURE_2D); gl.PushMatrix(); //强制刷新 gl.Translate(dx, dy, mydem.high[Convert.ToInt32(mydem.m - (dy + 50) / 0.5 - 1), Convert.ToInt32((dx + 50) / 0.5)]); texture[treeId[index]].Bind(gl); gl.Color(1f, 1f, 1f, 1f); gl.Begin(OpenGL.GL_QUADS); { gl.TexCoord(0, 1); gl.Vertex(-0.5f, 0f, 0f); gl.TexCoord(1, 1); gl.Vertex(0.5f, 0f, 0f); gl.TexCoord(1, 0); gl.Vertex(0.5f, 0f, 3.0f); gl.TexCoord(0, 0); gl.Vertex(-0.5f, 0.0f, 3.0f); } gl.End(); gl.Rotate(0f, 0f, 90); gl.Begin(OpenGL.GL_QUADS); { gl.TexCoord(0, 1); gl.Vertex(-0.5f, 0f, 0f); gl.TexCoord(1, 1); gl.Vertex(0.5f, 0f, 0f); gl.TexCoord(1, 0); gl.Vertex(0.5f, 0f, 3.0f); gl.TexCoord(0, 0); gl.Vertex(-0.5f, 0.0f, 3.0f); } gl.End(); gl.PopMatrix(); gl.Disable(OpenGL.GL_TEXTURE_2D); gl.Disable(OpenGL.GL_BLEND); gl.Disable(OpenGL.GL_ALPHA); }
//设置抗锯齿开关(实验性) //开启后在画圆时会出问题 public void setSmooth(bool value) { if (value == true) { gl.Enable(OpenGL.GL_BLEND); gl.BlendFunc(OpenGL.GL_SRC_ALPHA, OpenGL.GL_ONE_MINUS_SRC_ALPHA); gl.Enable(OpenGL.GL_POINT_SMOOTH); gl.Enable(OpenGL.GL_LINE_SMOOTH); gl.Enable(OpenGL.GL_POLYGON_SMOOTH); } else { gl.Disable(OpenGL.GL_BLEND); gl.Disable(OpenGL.GL_POINT_SMOOTH); gl.Disable(OpenGL.GL_LINE_SMOOTH); gl.Disable(OpenGL.GL_POLYGON_SMOOTH); } }
public override void OnLoad(OpenGL gl) { gl.Enable(OpenGL.GL_CULL_FACE); gl.Enable(OpenGL.GL_DEPTH_TEST); gl.Enable(OpenGL.GL_BLEND); gl.BlendFunc(BlendingSourceFactor.SourceAlpha, BlendingDestinationFactor.OneMinusSourceAlpha); _camera = new OrthographicCamera(); _camera.View *= Mat4.RotateY(Angle.FromDegrees(15)); _shader = new BasicShader(gl); _modelUniform = gl.GetUniformLocation(_shader.Handle, "Model"); _viewUniform = gl.GetUniformLocation(_shader.Handle, "View"); _projectionUniform = gl.GetUniformLocation(_shader.Handle, "Projection"); _graph = new OpenGLSceneGraph(); _graph.Nodes.Add(new CoordinateSystemLeaf(gl, _shader, _model.Features.OfType<CoordinateSystem>())); _graph.Nodes.Add(new DatumPlaneLeaf(gl, _shader, _model.Features.OfType<DatumPlane>())); _graph.Nodes.Add(new GeometryLeaf(gl, _shader)); }
/// <summary> /// This is called when a face is interactable, so highlight it. /// </summary> void IInteractable.DrawPick(OpenGL gl) { // Save all the attributes. gl.PushAttrib(OpenGL.ALL_ATTRIB_BITS); // Disable lighting, set colour to red etc. gl.Disable(OpenGL.LIGHTING); gl.DepthFunc(OpenGL.LEQUAL); // Now draw it with a faint red. gl.Enable(OpenGL.BLEND); gl.BlendFunc(OpenGL.SRC_ALPHA, OpenGL.ONE_MINUS_SRC_ALPHA); gl.Color(1, 0, 0, 0.2f); // Draw the face. gl.Begin(OpenGL.POLYGON); foreach (Index index in indices) { gl.Vertex(parentpoly.Vertices[index.Vertex]); } gl.End(); gl.Disable(OpenGL.BLEND); // Draw the face. gl.Begin(OpenGL.LINE_LOOP); for (int i = 0; i < indices.Count - 1; i++) { gl.Vertex(parentpoly.Vertices[indices[i].Vertex]); } gl.End(); gl.PopAttrib(); }
void IRenderable.Render(OpenGL gl, RenderMode renderMode) { if (positionBuffer == null || colorBuffer == null) { return; } if (this.shaderProgram == null) { this.shaderProgram = InitShader(gl, renderMode); } if (this.vertexArrayObject == null) { CreateVertexArrayObject(gl, renderMode); } BeforeRendering(gl, renderMode); if (this.RenderGridWireframe && this.vertexArrayObject != null) { //if (wireframeIndexBuffer != null) if (positionBuffer != null && colorBuffer != null && indexBuffer != null) { shaderProgram.SetUniform1(gl, "renderingWireframe", 1.0f);// shader一律上白色。 gl.Disable(OpenGL.GL_LINE_STIPPLE); gl.Disable(OpenGL.GL_POLYGON_STIPPLE); gl.Enable(OpenGL.GL_LINE_SMOOTH); gl.Enable(OpenGL.GL_POLYGON_SMOOTH); gl.ShadeModel(SharpGL.Enumerations.ShadeModel.Smooth); gl.Hint(SharpGL.Enumerations.HintTarget.LineSmooth, SharpGL.Enumerations.HintMode.Nicest); gl.Hint(SharpGL.Enumerations.HintTarget.PolygonSmooth, SharpGL.Enumerations.HintMode.Nicest); gl.PolygonMode(SharpGL.Enumerations.FaceMode.FrontAndBack, SharpGL.Enumerations.PolygonMode.Lines); gl.Enable(OpenGL.GL_PRIMITIVE_RESTART); gl.PrimitiveRestartIndex(uint.MaxValue); gl.Enable(OpenGL.GL_BLEND); gl.BlendFunc(SharpGL.Enumerations.BlendingSourceFactor.SourceAlpha, SharpGL.Enumerations.BlendingDestinationFactor.OneMinusSourceAlpha); gl.BindVertexArray(this.vertexArrayObject[0]); gl.BindBuffer(OpenGL.GL_ELEMENT_ARRAY_BUFFER, indexBuffer[0]); gl.DrawElements(OpenGL.GL_QUAD_STRIP, this.indexBufferLength, OpenGL.GL_UNSIGNED_INT, IntPtr.Zero); gl.BindVertexArray(0); gl.Disable(OpenGL.GL_BLEND); gl.Disable(OpenGL.GL_PRIMITIVE_RESTART); gl.PolygonMode(SharpGL.Enumerations.FaceMode.FrontAndBack, SharpGL.Enumerations.PolygonMode.Filled); gl.Disable(OpenGL.GL_POLYGON_SMOOTH); } } if (this.RenderGrid && this.vertexArrayObject != null) { if (positionBuffer != null && colorBuffer != null && indexBuffer != null) { shaderProgram.SetUniform1(gl, "renderingWireframe", 0.0f);// shader根据uv buffer来上色。 gl.Enable(OpenGL.GL_PRIMITIVE_RESTART); gl.PrimitiveRestartIndex(uint.MaxValue); gl.Enable(OpenGL.GL_BLEND); gl.BlendFunc(SharpGL.Enumerations.BlendingSourceFactor.SourceAlpha, SharpGL.Enumerations.BlendingDestinationFactor.OneMinusSourceAlpha); gl.BindVertexArray(this.vertexArrayObject[0]); gl.BindBuffer(OpenGL.GL_ELEMENT_ARRAY_BUFFER, indexBuffer[0]); gl.DrawElements(OpenGL.GL_QUAD_STRIP, this.indexBufferLength, OpenGL.GL_UNSIGNED_INT, IntPtr.Zero); gl.BindVertexArray(0); gl.Disable(OpenGL.GL_BLEND); gl.Disable(OpenGL.GL_PRIMITIVE_RESTART); } } AfterRendering(gl, renderMode); }
/// <summary> /// Draw a mesh. /// </summary> /// <param name="gl">OpenGL handler.</param> /// <param name="buildingObj">The mesh.</param>BuildingObjectLib3DS _object, private void DrawMesh(OpenGL gl, Lib3dsMesh thisMesh, Hashtable textures, List<Lib3dsMaterial> matrials, DrawType type) { if (thisMesh == null || thisMesh.nfaces == 0) return; // Draw all the faces in this mesh. for (int j = 0; j < thisMesh.faces.Count; j++) { Lib3dsFace thisFace = thisMesh.faces[j]; float transparency = matrials[thisFace.material].transparency; //float[] fogColor = new float[4] { 0.5f, 0.5f, 0.5f, 1.0f }; //float[] LightAmbient = new float[4] { 0.5f, 0.5f, 0.5f, 1.0f }; //float[] LightDiffuse = new float[4] { 1.0f, 1.0f, 1.0f, 1.0f }; //float[] LightPosition = new float[4] { 0.0f, 0.0f, 2.0f, 1.0f }; switch (type) { case DrawType.WireFrame: gl.PolygonMode(OpenGL.GL_FRONT_AND_BACK, OpenGL.GL_LINE); IsDrawTexture = false; gl.Color(0.5f, 0.5f, 0.5f, 0.5f); gl.LineWidth(1.5f); break; case DrawType.Full: IsDrawTexture = BindTexture(gl, textures, matrials[thisFace.material].name); gl.PolygonMode(OpenGL.GL_FRONT_AND_BACK, OpenGL.GL_FILL); break; case DrawType.Face: gl.PolygonMode(OpenGL.GL_FRONT_AND_BACK, OpenGL.GL_FILL); IsDrawTexture = false; break; case DrawType.Translucent: IsDrawTexture = BindTexture(gl, textures, matrials[thisFace.material].name); gl.PolygonMode(OpenGL.GL_FRONT_AND_BACK, OpenGL.GL_FILL); gl.Enable(OpenGL.GL_BLEND); gl.BlendFunc(OpenGL.GL_SRC_ALPHA,OpenGL.GL_ONE_MINUS_SRC_ALPHA); //gl.Enable(OpenGL.GL_TEXTURE_2D); // Enable Texture Mapping //gl.ShadeModel(OpenGL.GL_SMOOTH); // Enable Smooth Shading //gl.ClearColor(0.5f,0.5f,0.5f,1.0f); // We'll Clear To The Color Of The Fog //gl.ClearDepth(1.0f); // Depth Buffer Setup //gl.Enable(OpenGL.GL_DEPTH_TEST); // Enables Depth Testing //gl.DepthFunc(OpenGL.GL_LEQUAL); // The Type Of Depth Testing To Do //gl.Hint(OpenGL.GL_PERSPECTIVE_CORRECTION_HINT, OpenGL.GL_NICEST); // Really Nice Perspective Calculations //gl.Light(OpenGL.GL_LIGHT1, OpenGL.GL_AMBIENT, LightAmbient); // Setup The Ambient Light //gl.Light(OpenGL.GL_LIGHT1, OpenGL.GL_DIFFUSE, LightDiffuse); // Setup The Diffuse Light //gl.Light(OpenGL.GL_LIGHT1, OpenGL.GL_POSITION,LightPosition); // Position The Light //gl.Enable(OpenGL.GL_LIGHT1); //gl.Fog(OpenGL.GL_FOG_COLOR, fogColor);//设置雾颜色,f是一个指定颜色的数组float f[4] //gl.Fog(OpenGL.GL_FOG_DENSITY, 0.85f); // 设置雾的密度 //gl.Hint(OpenGL.GL_FOG_HINT, OpenGL.GL_DONT_CARE); // 设置系统如何计算雾气 //gl.Fog(OpenGL.GL_FOG_START, 0.01f);//设置雾从多远开始 //gl.Fog(OpenGL.GL_FOG_END, 100.0f);//设置雾从多远结束 //gl.Fog(OpenGL.GL_FOG_MODE, OpenGL.GL_LINEAR);//设置使用哪种雾,共有三中雾化模式 //gl.Enable(OpenGL.GL_FOG);//打开雾效果 transparency = 0.2f; break; default: gl.PolygonMode(OpenGL.GL_FRONT_AND_BACK, OpenGL.GL_FILL); IsDrawTexture = false; break; } if (type != DrawType.WireFrame) { gl.Color(matrials[thisFace.material].diffuse[0], matrials[thisFace.material].diffuse[1], matrials[thisFace.material].diffuse[2], matrials[thisFace.material].transparency); } gl.Begin(OpenGL.GL_TRIANGLES); for (int k = 0; k != 3; ++k) { int index = thisFace.index[k]; if (IsDrawTexture) gl.TexCoord(thisMesh.texcos[index].s, thisMesh.texcos[index].t); gl.Vertex(thisMesh.vertices[index].x / 20, thisMesh.vertices[index].z / 20, -thisMesh.vertices[index].y / 20); } gl.End(); if(type == DrawType.Translucent) gl.Disable(OpenGL.GL_BLEND); } }
public void InitEngine(OpenGL gl) { try { DebugTools.LogToConsole("Prepareing GL"); //setup open gl and activate modes gl.TexParameter(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_WRAP_S, OpenGL.GL_REPEAT); gl.TexParameter(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_WRAP_T, OpenGL.GL_REPEAT); gl.TexParameter(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MAG_FILTER, OpenGL.GL_NEAREST); gl.TexParameter(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MIN_FILTER, OpenGL.GL_NEAREST); gl.Enable(OpenGL.GL_BLEND); gl.Enable(OpenGL.GL_TEXTURE_2D); gl.Enable(OpenGL.GL_DEPTH_TEST); //fffgl.Enable(OpenGL.GL_LIGHTING); gl.BlendFunc(OpenGL.GL_SRC_ALPHA, OpenGL.GL_ONE_MINUS_SRC_ALPHA); gl.ShadeModel(OpenGL.GL_SMOOTH); //Darw the first frame with a load test Draw(gl); DebugTools.LogToConsole("Loading Resources"); //Loading the resources and bind to gl resourceManager = new ResourceManager(); DebugTools.LogToConsole("Applying Textures"); resourceManager.InitTextures(gl); DebugTools.LogToConsole("Loading Level"); //Loading level //_level = new MasterMindGame.MasterMind(); //_level.Build(this); _level = new MasterMindGame.MasterMind(); _level.Build(this); GameObjects.Sort( delegate(GameObject p1, GameObject p2) { return p1.Z_Index.CompareTo(p2.Z_Index); } ); //Startup is complete StartupComplete = true; } catch (Exception error) { DebugTools.LogError(error); } }
/// <summary> /// Create device and renderbuffer, initialize NV_DX_interop and start rendering. /// </summary> private void StartRendering() { _gl = new OpenGL(); _hwnd = new HwndSource(0, 0, 0, 0, 0, "test", IntPtr.Zero).Handle; _gl.Create(SharpGL.Version.OpenGLVersion.OpenGL2_1, RenderContextType.HiddenWindow, 1, 1, 32, _hwnd); // Set the most basic OpenGL styles. _gl.ShadeModel(OpenGL.GL_SMOOTH); _gl.ClearColor(0.0f, 0.0f, 0.0f, 1.0f); _gl.ClearDepth(1.0f); _gl.Enable(OpenGL.GL_BLEND); _gl.Disable(OpenGL.GL_DEPTH_TEST); _gl.Enable(OpenGL.GL_TEXTURE_2D); _gl.TexEnv(OpenGL.GL_TEXTURE_ENV, OpenGL.GL_TEXTURE_ENV_MODE, OpenGL.GL_REPLACE); _gl.BlendFunc(OpenGL.GL_SRC_ALPHA, OpenGL.GL_ONE_MINUS_SRC_ALPHA); //_gl.Enable(OpenGL.GL_MULTISAMPLE); //_gl.Enable(OpenGL.GL_MULTISAMPLE_ARB); _gl.Hint(0x8534, OpenGL.GL_FASTEST); ResizeRendering(); // leverage the Rendering event of WPF's composition target to // update the custom D3D scene CompositionTarget.Rendering += OnRenderOpenGL; if (GLInitialize != null) GLInitialize(this, new EventArgs()); }
/// <summary> /// Casts a real time 3D shadow. /// </summary> /// <param name="gl">The OpenGL object.</param> /// <param name="lights">The lights.</param> private void CastShadow(OpenGL gl) { // Set the connectivity, (calculate the neighbours of each face). SetConnectivity(); // Get the lights in the scene. var lights = TraverseToRootElement().Traverse <Light>(l => l.IsEnabled && l.On && l.CastShadow); // Get some useful references. var faces = ParentPolygon.Faces; // Go through every light in the scene. foreach (var light in lights) { // Every face will have a visibility setting. bool[] facesVisible = new bool[faces.Count]; // Get the light position relative to the polygon. Vertex lightPos = light.Position; lightPos = lightPos - ParentPolygon.Transformation.TranslationVertex; // Go through every face, finding out whether it's visible to the light. for (int nFace = 0; nFace < faces.Count; nFace++) { // Get a reference to the face. Face face = faces[nFace]; // Is this face facing the light? float[] planeEquation = face.GetPlaneEquation(ParentPolygon); float side = planeEquation[0] * lightPos.X + planeEquation[1] * lightPos.Y + planeEquation[2] * lightPos.Z + planeEquation[3]; facesVisible[nFace] = (side > 0) ? true : false; } // Save all the attributes. gl.PushAttrib(OpenGL.GL_ALL_ATTRIB_BITS); // Turn off lighting. gl.Disable(OpenGL.GL_LIGHTING); // Turn off writing to the depth mask. gl.DepthMask(0); gl.DepthFunc(OpenGL.GL_LEQUAL); // Turn on stencil buffer testing. gl.Enable(OpenGL.GL_STENCIL_TEST); // Translate our shadow volumes. ParentPolygon.PushObjectSpace(gl); // Don't draw to the color buffer. gl.ColorMask(0, 0, 0, 0); gl.StencilFunc(OpenGL.GL_ALWAYS, 1, 0xFFFFFFFF); gl.Enable(OpenGL.GL_CULL_FACE); // First Pass. Increase Stencil Value In The Shadow gl.FrontFace(OpenGL.GL_CCW); gl.StencilOp(OpenGL.GL_KEEP, OpenGL.GL_KEEP, OpenGL.GL_INCR); DoShadowPass(gl, lightPos, facesVisible); // Second Pass. Decrease Stencil Value In The Shadow gl.FrontFace(OpenGL.GL_CW); gl.StencilOp(OpenGL.GL_KEEP, OpenGL.GL_KEEP, OpenGL.GL_DECR); DoShadowPass(gl, lightPos, facesVisible); gl.FrontFace(OpenGL.GL_CCW); ParentPolygon.PopObjectSpace(gl); // Enable writing to the color buffer. gl.ColorMask(1, 1, 1, 1); // Draw A Shadowing Rectangle Covering The Entire Screen gl.Color(light.ShadowColor); gl.Enable(OpenGL.GL_BLEND); gl.BlendFunc(OpenGL.GL_SRC_ALPHA, OpenGL.GL_ONE_MINUS_SRC_ALPHA); gl.StencilFunc(OpenGL.GL_NOTEQUAL, 0, 0xFFFFFFF); gl.StencilOp(OpenGL.GL_KEEP, OpenGL.GL_KEEP, OpenGL.GL_KEEP); Sphere shadow = new Sphere(); shadow.Transformation.ScaleX = shadowSize; shadow.Transformation.ScaleY = shadowSize; shadow.Transformation.ScaleZ = shadowSize; shadow.Render(gl, RenderMode.Design); gl.PopAttrib(); } }
/// <summary> /// This is called when a face is interactable, so highlight it. /// </summary> void IInteractable.DrawPick(OpenGL gl) { // Save all the attributes. gl.PushAttrib(OpenGL.ALL_ATTRIB_BITS); // Disable lighting, set colour to red etc. gl.Disable(OpenGL.LIGHTING); gl.DepthFunc(OpenGL.LEQUAL); // Now draw it with a faint red. gl.Enable(OpenGL.BLEND); gl.BlendFunc(OpenGL.SRC_ALPHA, OpenGL.ONE_MINUS_SRC_ALPHA); gl.Color(1, 0, 0, 0.2f); // Draw the face. gl.Begin(OpenGL.POLYGON); foreach(Index index in indices) gl.Vertex(parentpoly.Vertices[index.Vertex]); gl.End(); gl.Disable(OpenGL.BLEND); // Draw the face. gl.Begin(OpenGL.LINE_LOOP); for(int i = 0; i < indices.Count - 1; i++) gl.Vertex(parentpoly.Vertices[indices[i].Vertex]); gl.End(); gl.PopAttrib(); }
/// <summary> /// 渲染基质 /// </summary> /// <param name="gl"></param> /// <param name="renderMode"></param> private void DoRenderMatrix(OpenGL gl, RenderMode renderMode) { if (this.positionBuffer == null || this.colorBuffer == null) { return; } if (this.RenderGrid && this.matrixVertexArrayObject != null) { shaderProgram.SetUniform1(gl, "renderingWireframe", 0.0f); shaderProgram.SetUniform1(gl, "opacity", this.Opacity); gl.Enable(OpenGL.GL_POLYGON_OFFSET_FILL); gl.PolygonOffset(1.0f, 1.0f); gl.Enable(OpenGL.GL_BLEND); gl.BlendFunc(SharpGL.Enumerations.BlendingSourceFactor.SourceAlpha, SharpGL.Enumerations.BlendingDestinationFactor.OneMinusSourceAlpha); gl.BindVertexArray(matrixVertexArrayObject[0]); switch (this.MatrixType) { case MatrixFormat.Triangle: gl.DrawArrays(this.matrixRenderMode, 0, this.MatrixVertexOrIndexCount); break; case MatrixFormat.Tetrahedron: gl.Enable(OpenGL.GL_PRIMITIVE_RESTART); gl.PrimitiveRestartIndex(uint.MaxValue); gl.BindBuffer(OpenGL.GL_ELEMENT_ARRAY_BUFFER, this.matrixIndexBuffer[0]); gl.DrawElements(this.matrixRenderMode, this.MatrixVertexOrIndexCount, OpenGL.GL_UNSIGNED_INT, IntPtr.Zero); gl.Disable(OpenGL.GL_PRIMITIVE_RESTART); break; case MatrixFormat.TriangularPrism: // 先渲染三棱柱的上下三角形 gl.DrawArrays(OpenGL.GL_TRIANGLES, 0, this.MatrixVertexOrIndexCount); // 再渲染三棱柱的三个侧面 gl.Enable(OpenGL.GL_PRIMITIVE_RESTART); gl.PrimitiveRestartIndex(uint.MaxValue); gl.BindBuffer(OpenGL.GL_ELEMENT_ARRAY_BUFFER, this.matrixIndexBuffer[0]); gl.DrawElements(this.matrixRenderMode, this.MatrixVertexOrIndexCount, OpenGL.GL_UNSIGNED_INT, IntPtr.Zero); gl.Disable(OpenGL.GL_PRIMITIVE_RESTART); break; default: break; } gl.BindVertexArray(0); gl.Disable(OpenGL.GL_BLEND); gl.Disable(OpenGL.GL_POLYGON_OFFSET_FILL); } if (this.RenderGridWireframe && this.matrixVertexArrayObject != null) { shaderProgram.SetUniform1(gl, "renderingWireframe", 1.0f); shaderProgram.SetUniform1(gl, "opacity", this.Opacity); gl.PolygonMode(SharpGL.Enumerations.FaceMode.FrontAndBack, SharpGL.Enumerations.PolygonMode.Lines); gl.Enable(OpenGL.GL_BLEND); gl.BlendFunc(SharpGL.Enumerations.BlendingSourceFactor.SourceAlpha, SharpGL.Enumerations.BlendingDestinationFactor.OneMinusSourceAlpha); gl.BindVertexArray(matrixVertexArrayObject[0]); switch (this.MatrixType) { case MatrixFormat.Triangle: gl.DrawArrays(this.matrixRenderMode, 0, this.MatrixVertexOrIndexCount); break; case MatrixFormat.Tetrahedron: gl.Enable(OpenGL.GL_PRIMITIVE_RESTART); gl.PrimitiveRestartIndex(uint.MaxValue); gl.BindBuffer(OpenGL.GL_ELEMENT_ARRAY_BUFFER, this.matrixIndexBuffer[0]); gl.DrawElements(this.matrixRenderMode, this.MatrixVertexOrIndexCount, OpenGL.GL_UNSIGNED_INT, IntPtr.Zero); gl.Disable(OpenGL.GL_PRIMITIVE_RESTART); break; case MatrixFormat.TriangularPrism: // 先渲染三棱柱的上下三角形 gl.DrawArrays(OpenGL.GL_TRIANGLES, 0, this.MatrixVertexOrIndexCount / 9 * 6); // 再渲染三棱柱的三个侧面 gl.Enable(OpenGL.GL_PRIMITIVE_RESTART); gl.PrimitiveRestartIndex(uint.MaxValue); gl.BindBuffer(OpenGL.GL_ELEMENT_ARRAY_BUFFER, this.matrixIndexBuffer[0]); gl.DrawElements(this.matrixRenderMode, this.MatrixVertexOrIndexCount, OpenGL.GL_UNSIGNED_INT, IntPtr.Zero); gl.Disable(OpenGL.GL_PRIMITIVE_RESTART); break; default: break; } gl.PolygonMode(SharpGL.Enumerations.FaceMode.FrontAndBack, SharpGL.Enumerations.PolygonMode.Filled); gl.BindVertexArray(0); gl.Disable(OpenGL.GL_BLEND); } }
public override void OnLoad(OpenGL gl) { gl.Enable(OpenGL.GL_CULL_FACE); gl.Enable(OpenGL.GL_DEPTH_TEST); gl.Enable(OpenGL.GL_BLEND); gl.BlendFunc(BlendingSourceFactor.SourceAlpha, BlendingDestinationFactor.OneMinusSourceAlpha); _camera = new OrthographicCamera(); _camera.View *= Mat4.RotateY(Angle.FromDegrees(15)); _shader = new BasicShader(gl); _modelUniform = gl.GetUniformLocation(_shader.Handle, "Model"); _viewUniform = gl.GetUniformLocation(_shader.Handle, "View"); _projectionUniform = gl.GetUniformLocation(_shader.Handle, "Projection"); _graph = new SceneGraph(); _graph.Nodes.Add(new CoordinateSystemLeaf(gl, _shader, _model.Features.OfType<CoordinateSystem>())); _graph.Nodes.Add(new DatumPlaneLeaf(gl, _shader, _model.Features.OfType<DatumPlane>())); const double s = 5.0; var v0 = new Vertex("v0", new Vect3(0, 0, 0)); var v1 = new Vertex("v1", new Vect3(0, 0, s)); var v2 = new Vertex("v2", new Vect3(s, 0, s)); var v3 = new Vertex("v3", new Vect3(s, 0, 0)); var v4 = new Vertex("v4", new Vect3(0, s, 0)); var v5 = new Vertex("v5", new Vect3(0, s, s)); var v6 = new Vertex("v6", new Vect3(s, s, s)); var v7 = new Vertex("v7", new Vect3(s, s, 0)); var f0 = new Face("f0"); var f1 = new Face("f1"); var f2 = new Face("f2"); var f3 = new Face("f3"); var f4 = new Face("f4"); var f5 = new Face("f5"); LineHalfEdge e0a = null; LineHalfEdge e0b = null; LineHalfEdge e1a = null; LineHalfEdge e1b = null; LineHalfEdge e2a = null; LineHalfEdge e2b = null; LineHalfEdge e3a = null; LineHalfEdge e3b = null; LineHalfEdge e4a = null; LineHalfEdge e4b = null; LineHalfEdge e5a = null; LineHalfEdge e5b = null; LineHalfEdge e6a = null; LineHalfEdge e6b = null; LineHalfEdge e7a = null; LineHalfEdge e7b = null; LineHalfEdge e8a = null; LineHalfEdge e8b = null; LineHalfEdge e9a = null; LineHalfEdge e9b = null; LineHalfEdge e10a = null; LineHalfEdge e10b = null; LineHalfEdge e11a = null; LineHalfEdge e11b = null; e0a = new LineHalfEdge("e0a", v1, new Lazy<IHalfEdge>(() => e0b), f0); e1a = new LineHalfEdge("e1a", v2, new Lazy<IHalfEdge>(() => e1b), f0); e2a = new LineHalfEdge("e2a", v3, new Lazy<IHalfEdge>(() => e2b), f0); e3a = new LineHalfEdge("e3a", v0, new Lazy<IHalfEdge>(() => e3b), f0); f0.Loops.Add(new EdgeLoop(e0a, e1a, e2a, e3a)); e0b = new LineHalfEdge("e0b", v0, new Lazy<IHalfEdge>(() => e0a), f1); e7a = new LineHalfEdge("e7a", v4, new Lazy<IHalfEdge>(() => e7b), f1); e8a = new LineHalfEdge("e8a", v5, new Lazy<IHalfEdge>(() => e8b), f1); e4a = new LineHalfEdge("e4a", v1, new Lazy<IHalfEdge>(() => e4b), f1); f1.Loops.Add(new EdgeLoop(e0b, e7a, e8a, e4a)); e1b = new LineHalfEdge("e1b", v1, new Lazy<IHalfEdge>(() => e1a), f2); e4b = new LineHalfEdge("e4b", v5, new Lazy<IHalfEdge>(() => e4a), f2); e9a = new LineHalfEdge("e9a", v6, new Lazy<IHalfEdge>(() => e9b), f2); e5a = new LineHalfEdge("e5a", v2, new Lazy<IHalfEdge>(() => e5b), f2); f2.Loops.Add(new EdgeLoop(e1b, e4b, e9a, e5a)); e2b = new LineHalfEdge("e2b", v2, new Lazy<IHalfEdge>(() => e2a), f3); e5b = new LineHalfEdge("e5b", v6, new Lazy<IHalfEdge>(() => e5a), f3); e10a = new LineHalfEdge("e10a", v7, new Lazy<IHalfEdge>(() => e10b), f3); e6a = new LineHalfEdge("e6a", v3, new Lazy<IHalfEdge>(() => e6b), f3); f3.Loops.Add(new EdgeLoop(e2b, e5b, e10a, e6a)); e3b = new LineHalfEdge("e3b", v3, new Lazy<IHalfEdge>(() => e3a), f4); e6b = new LineHalfEdge("e6b", v7, new Lazy<IHalfEdge>(() => e6a), f4); e11a = new LineHalfEdge("e11a", v4, new Lazy<IHalfEdge>(() => e11b), f4); e7b = new LineHalfEdge("e7b", v0, new Lazy<IHalfEdge>(() => e7a), f4); f4.Loops.Add(new EdgeLoop(e3b, e6b, e11a, e7b)); e8b = new LineHalfEdge("e8b", v4, new Lazy<IHalfEdge>(() => e8a), f5); e11b = new LineHalfEdge("e11b", v7, new Lazy<IHalfEdge>(() => e11a), f5); e10b = new LineHalfEdge("e10b", v6, new Lazy<IHalfEdge>(() => e10a), f5); e9b = new LineHalfEdge("e9b", v5, new Lazy<IHalfEdge>(() => e9b), f5); f5.Loops.Add(new EdgeLoop(e8b, e11b, e10b, e9b)); var shell = new Shell(f0,f1,f2,f3,f4,f5); var data = new List<Vert>(); foreach (var face in shell.Faces) { foreach (var loop in face.Loops) { foreach (var edge in loop.Edges) { data.Add(new Vert(edge.Start, Vect3.Zero, Color.Gold.ToVector4())); data.Add(new Vert(edge.End, Vect3.Zero, Color.Gold.ToVector4())); } } } _points = new PointRenderer(gl,_shader,data); // gl.PolygonMode(FaceMode.FrontAndBack, PolygonMode.Lines); }