15事例十五:纹理映射

Posted lotuses

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了15事例十五:纹理映射相关的知识,希望对你有一定的参考价值。

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();

        
    

 

以上是关于15事例十五:纹理映射的主要内容,如果未能解决你的问题,请参考以下文章

纹理和纹理映射 GLUTess 多边形?

立方体的 WPF 纹理映射

在 OpenGL 中将纹理映射到球体时出现接缝问题

opengl 把纹理映射到立方体的六个面。

OpenGL纹理映射总结

FBO:渲染到纹理,绘制渲染纹理时纹理映射错误