//自动生成出现问题,推荐采用传统新建winform形式 namespace sharpGLTest16_1 { public partial class Form1 : Form { static float wrap = 0; // 用于雾的流动 SharpGL.SceneGraph.Assets.Texture[] textureAry = new SharpGL.SceneGraph.Assets.Texture[4]; float[] fLightPosition = new float[4] { 0.0f, 0.0f, 8.0f, 1.0f }; // 光源位置 float[] fLightAmbient = new float[4] { 1f, 1f, 1f, 1f }; // 环境光参数 float[] fLightDiffuse = new float[4] { 1f, 1f, 1f, 1f }; // 漫射光参数 bool multitexturing = true; public Form1() { InitializeComponent(); } private void openGLControl_OpenGLInitialized(object sender, EventArgs e) { OpenGL gl = openGLControl.OpenGL; String[] fileName = new String[4] { "wall.bmp", "lightmap.bmp", "bitmap.bmp", "fog.bmp" }; for (int i = 0; i < fileName.Length; i++) { textureAry[i] = new SharpGL.SceneGraph.Assets.Texture(); if (textureAry[i].Create(gl, fileName[i])) { textureAry[i].Id = i; textureAry[i].Name = fileName[i]; } } gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_AMBIENT, fLightAmbient);//环境光源 gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_DIFFUSE, fLightDiffuse);//漫射光源 gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_POSITION, fLightPosition);//光源位置 gl.Enable(OpenGL.GL_LIGHTING);//开启光照 gl.Enable(OpenGL.GL_LIGHT0); gl.ClearColor(0.0f, 0.0f, 0.0f, 0.5f); gl.ClearDepth(1.0f); gl.DepthFunc(OpenGL.GL_LEQUAL); gl.Enable(OpenGL.GL_DEPTH_TEST); gl.ShadeModel(OpenGL.GL_SMOOTH); gl.Hint(OpenGL.GL_PERSPECTIVE_CORRECTION_HINT, OpenGL.GL_NICEST); gl.Enable(OpenGL.GL_NORMALIZE); if (!initMultiTexture(gl)) { MessageBox.Show("您的硬件和驱动不支持多重纹理"); return; } } /// <summary> /// 检查多重纹理支持 /// </summary> /// <param name="input"></param> /// <returns></returns> bool isExtensionSupported(OpenGL gl, string input) { string extension = gl.GetString(OpenGL.GL_EXTENSIONS); return extension.IndexOf(input) >= 0; } bool initMultiTexture(OpenGL gl) { //检查是否支持扩展 if (isExtensionSupported(gl, "GL_ARB_multitexture")) { return true; } else return false; } private void openGLControl_Resized(object sender, EventArgs e) { OpenGL gl = openGLControl.OpenGL; gl.MatrixMode(OpenGL.GL_PROJECTION); gl.LoadIdentity(); gl.Perspective(45f, (double)Width / (double)Height, 1, 100.0); gl.MatrixMode(OpenGL.GL_MODELVIEW); draw(gl); } private void openGLControl_OpenGLDraw(object sender, PaintEventArgs e) { OpenGL gl = openGLControl.OpenGL; gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT); gl.LoadIdentity(); draw(gl); } private void draw(OpenGL Gl) { Gl.LoadIdentity(); Gl.Translate(0.0f, 0.0f, -10.0f); //激活纹理0,并绑定纹理 Gl.ActiveTextureARB(OpenGL.GL_TEXTURE0_ARB); Gl.Enable(OpenGL.GL_TEXTURE_2D); textureAry[0].Bind(Gl); Gl.ActiveTextureARB(OpenGL.GL_TEXTURE1_ARB); //如果多重纹理启用,则启用该纹理 if (multitexturing) Gl.Enable(OpenGL.GL_TEXTURE_2D); else Gl.Disable(OpenGL.GL_TEXTURE_2D); textureAry[1].Bind(Gl); // 绘制一个四方形墙面 Gl.PushMatrix(); { Gl.Translate(-2.5f, 0f, 0f); Gl.Scale(2.0f, 2.0f, 2.0f); Gl.Begin(OpenGL.GL_QUADS); { //左上点 Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE0_ARB, 0.0f, 1.0f); Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE1_ARB, 0.0f + wrap, 1.0f); Gl.Vertex(-1, 1, 0); // 左下点 Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE0_ARB, 0.0f, 0.0f); Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE1_ARB, 0.0f + wrap, 0.0f); Gl.Vertex(-1, -1, 0); // 右下点 Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE0_ARB, 1.0f, 0.0f); Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE1_ARB, 1.0f + wrap, 0.0f); Gl.Vertex(1, -1, 0); // 右上点 Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE0_ARB, 1.0f, 1.0f); Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE1_ARB, 1.0f + wrap, 1.0f); Gl.Vertex(1, 1, 0); } Gl.End(); } Gl.PopMatrix(); Gl.ActiveTextureARB(OpenGL.GL_TEXTURE0_ARB); Gl.Enable(OpenGL.GL_TEXTURE_2D); textureAry[2].Bind(Gl); Gl.ActiveTextureARB(OpenGL.GL_TEXTURE1_ARB); if (multitexturing) Gl.Enable(OpenGL.GL_TEXTURE_2D); else Gl.Disable(OpenGL.GL_TEXTURE_2D); textureAry[3].Bind(Gl); Gl.PushMatrix(); { Gl.Translate(2.5f, 0, 0); Gl.Scale(2.0f, 2.0f, 2.0f); Gl.Begin(OpenGL.GL_QUADS); { // 左上点 Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE0_ARB, 0.0f, 1.0f); Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE1_ARB, 0.0f - wrap, 1.0f); Gl.Vertex(-1, 1, 0); // 左下点 Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE0_ARB, 0.0f, 0.0f); Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE1_ARB, 0.0f - wrap, 0.0f); Gl.Vertex(-1, -1, 0); // 右下点 Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE0_ARB, 1.0f, 0.0f); Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE1_ARB, 1.0f - wrap, 0.0f); Gl.Vertex(1, -1, 0); // 右上点 Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE0_ARB, 1.0f, 1.0f); Gl.MultiTexCoord2ARB(OpenGL.GL_TEXTURE1_ARB, 1.0f - wrap, 1.0f); Gl.Vertex(1, 1, 0); } Gl.End(); wrap += 0.01f; } Gl.PopMatrix(); Gl.Flush(); } } }
原文地址:https://www.cnblogs.com/lotuses/p/11360335.html
时间: 2024-11-13 09:01:20