15、事例十五:纹理映射

不想你离开。 提交于 2019-11-27 10:49:10
namespace sharpGLTest15
{

    public partial class SharpGLForm : Form
    {
        float ang = 0f;
        SharpGL.SceneGraph.Assets.Texture[] textrue;
        float[] fLightPosition = new float[4] { 0.0f, 0.0f, 0.0f, 1.0f }; //5f, 8f, -8f, 1f };// 光源位置 
        float[] fLightAmbient = new float[4] { 0f, 0f, 0f, 1f };// 环境光参数 
        float[] fLightDiffuse = new float[4] { 1f, 1f, 1f, 1f };// 漫射光参数
        float[] fLightSpecular = new float[4] { 1f, 1f, 1f, 1f }; //镜面反射

        public SharpGLForm()
        {
            InitializeComponent();
        }

        private void openGLControl_OpenGLInitialized(object sender, EventArgs e)
        {
            textrue = new SharpGL.SceneGraph.Assets.Texture[6];
            for (int i = 0; i < 6; i++)
                textrue[i] = new SharpGL.SceneGraph.Assets.Texture();


            OpenGL gl = openGLControl.OpenGL;
            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.Light(OpenGL.GL_LIGHT0, OpenGL.GL_SPECULAR, fLightSpecular);

            textrue[0].Create(gl, "a1.jpg");
            textrue[1].Create(gl, "a2.jpg");
            textrue[2].Create(gl, "a3.jpg");
            textrue[3].Create(gl, "a4.jpg");
            textrue[4].Create(gl, "a1.jpg");
            textrue[5].Create(gl, "a2.jpg");


            gl.ClearColor(0.0f, 0.2f, 0.2f, 0.0f);
            gl.ClearDepth(1f);
            gl.DepthFunc(OpenGL.GL_LEQUAL);
            gl.Enable(OpenGL.GL_DEPTH_TEST);
            gl.ShadeModel(OpenGL.GL_SMOOTH);

            gl.Enable(OpenGL.GL_LIGHTING);//开启光照 
            gl.Enable(OpenGL.GL_LIGHT0);
            gl.Enable(OpenGL.GL_TEXTURE_2D);
            gl.Enable(OpenGL.GL_NORMALIZE);
        }

        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, 0.01, 100.0);
            gl.LookAt(1, 1, -1, 0, 0, 0, 0, 1, 0);
            gl.MatrixMode(OpenGL.GL_MODELVIEW);
        }

        private void openGLControl_OpenGLDraw(object sender, RenderEventArgs e)
        {
            OpenGL gl = openGLControl.OpenGL;
            gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
            gl.LoadIdentity();
            gl.Translate(-0.6f, 0f, 0.7f); gl.Rotate(ang, 0, 1, 0);
            drawBox(gl, 0f, 0f, 0.5f);
            ang += 2f;
        }
        private void drawBox(OpenGL gl, float xPos, float yPos, float zPos)
        {
            gl.PushMatrix();
            gl.Translate(xPos, yPos, zPos);

            textrue[0].Bind(gl);
            gl.Begin(OpenGL.GL_QUADS);
            {
                //前
                gl.Normal(1, 1, 1);
                gl.TexCoord(0, 0); gl.Vertex(0, 0, 0);
                gl.TexCoord(1, 0); gl.Vertex(-1, 0, 0);
                gl.TexCoord(1, 1); gl.Vertex(-1, -1, 0);
                gl.TexCoord(0, 1); gl.Vertex(0, -1, 0);
            }
            gl.End();

            textrue[1].Bind(gl);
            gl.Begin(OpenGL.GL_QUADS);
            {
                //底
                gl.Normal(1, 1, 1);
                gl.TexCoord(0, 0); gl.Vertex(0, 0, 0);
                gl.TexCoord(1, 0); gl.Vertex(0, 0, -1);
                gl.TexCoord(1, 1); gl.Vertex(-1, 0, -1);
                gl.TexCoord(0, 1); gl.Vertex(-1, 0, 0);
            }
            gl.End();

            //textrue[2].Bind(gl);
            //gl.Begin(OpenGL.GL_QUADS);
            //{
            //    //左
            //    gl.Normal(1, 1, 1);
            //    gl.TexCoord(0, 0); gl.Vertex(-1, 0, 0);
            //    gl.TexCoord(1, 0); gl.Vertex(-1, 0, -1);
            //    gl.TexCoord(1, 1); gl.Vertex(-1, -1, -1);
            //    gl.TexCoord(0, 1); gl.Vertex(-1, -1, 0);
            //}
            //gl.End();

            //textrue[3].Bind(gl);
            //gl.Begin(OpenGL.GL_QUADS);
            //{
            //    //右
            //    gl.Normal(1, 1, 1);
            //    gl.TexCoord(0, 0); gl.Vertex(0, 0, 0);
            //    gl.TexCoord(1, 0); gl.Vertex(0, 0, -1);
            //    gl.TexCoord(1, 1); gl.Vertex(0, -1, -1);
            //    gl.TexCoord(0, 1); gl.Vertex(0, -1, 0);
            //}
            //gl.End();

            textrue[4].Bind(gl);
            gl.Begin(OpenGL.GL_QUADS);
            {
                //后
                gl.Normal(1, 1, 1);
                gl.TexCoord(0, 0); gl.Vertex(0, 0, -1);
                gl.TexCoord(1, 0); gl.Vertex(-1, 0, -1);
                gl.TexCoord(1, 1); gl.Vertex(-1, -1, -1);
                gl.TexCoord(0, 1); gl.Vertex(0, -1, -1);
            }
            gl.End();

            textrue[5].Bind(gl);
            gl.Begin(OpenGL.GL_QUADS);
            {
                //顶
                gl.Normal(1, 1, 1);
                gl.TexCoord(0, 0); gl.Vertex(0, -1, 0);
                gl.TexCoord(1, 0); gl.Vertex(0, -1, -1);
                gl.TexCoord(1, 1); gl.Vertex(-1, -1, -1);
                gl.TexCoord(0, 1); gl.Vertex(-1, -1, 0);
            }
            gl.End();

            gl.PopMatrix();

        }
    }
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!