16事例十六:多重纹理映射
Posted lotuses
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了16事例十六:多重纹理映射相关的知识,希望对你有一定的参考价值。
//自动生成出现问题,推荐采用传统新建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();
以上是关于16事例十六:多重纹理映射的主要内容,如果未能解决你的问题,请参考以下文章