OpenGLES中的纹理映射问题

时间:2009-01-23 00:48:43

标签: c# graphics opengl-es

我是OpenGL的新手,我正在使用为Windows Mobile手机编写的托管OpenGLES包装器(OpenGLES Windows Mobile)。我有一个简单的任务:绘制一个正方形(得到它)并用磁盘中的图像对其进行纹理化,所以我基本上只想在屏幕上显示一个jpg文件。但是每次我尝试这样做时,都会显示一个没有纹理的白色方块。我验证了我的纹理正确加载(使用一些现有的例子,只是用我的纹理替换纹理)。所以我认为我的问题是正确地将纹理映射到对象。这是我的代码(删除函数和对象以简化它):

        private Bitmap image = new Bitmap(@"\Storage Card\someimage.jpg");
        using (MemoryStream ms = new MemoryStream())
        {
            Image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
            myImage = Texture.LoadStream(ms, false);
        }
        gl.ShadeModel(gl.GL_SMOOTH);
        gl.ClearColor(0.0f, 0.0f, 0.0f, 0.5f);
        gl.BlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA);
        gl.Hint(gl.GL_PERSPECTIVE_CORRECTION_HINT, gl.GL_NICEST);
        glLocation.Clear();
        gl.Clear(gl.GL_COLOR_BUFFER_BIT);
        gl.MatrixMode(gl.GL_PROJECTION);
        gl.LoadIdentity();
        gl.Orthof(0, ClientSize.Width, ClientSize.Height, 0, 0, 1);
        gl.Disable(gl.GL_DEPTH_TEST);

        gl.MatrixMode(gl.GL_MODELVIEW);
        gl.LoadIdentity();
        float[] rectangle = new float[] {
            0, 0,
            myImage.Width, 0,
            0,  myImage.Height,
            myImage.Width,  myImage.Height
        };

        float[] texturePosition = new float[] {
            0, 0,
            myImage.Width, 0,
            0,  myImage.Height,
            myImage.Width,  myImage.Height
        };

        //Bind texture
        gl.BindTexture(gl.GL_TEXTURE_2D, myImage.Name);
        gl.TexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR);
        gl.TexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR);
        //move cursor
        glLocation.MoveCursor(Location.X, Location.Y);
        gl.EnableClientState(gl.GL_TEXTURE_COORD_ARRAY);
        gl.EnableClientState(gl.GL_VERTEX_ARRAY);

        //draw square and texture it.
        fixed (float* rectanglePointer = &rectangle[0], positionPointer = &texturePosition[0])
        {
            gl.TexCoordPointer(2, gl.GL_FLOAT, 0, (IntPtr)positionPointer);
            gl.VertexPointer(2, gl.GL_FLOAT, 0, (IntPtr)rectanglePointer);
            gl.DrawArrays(gl.GL_TRIANGLE_STRIP, 0, 4);
        }

        gl.DisableClientState(gl.GL_TEXTURE_COORD_ARRAY);
        gl.DisableClientState(gl.GL_VERTEX_ARRAY);
        egl.SwapBuffers(myDisplay, mySurface);
        gl.Clear(gl.GL_COLOR_BUFFER_BIT);

2 个答案:

答案 0 :(得分:2)

您尚未启用GL_TEXTURE_2D - 添加此行

gl.glEnable(gl.GL_TEXTURE_2D)

答案 1 :(得分:0)

尝试将纹理位置坐标从myImage.Width和myImage.Height更改为1.0。纹理坐标为0.0到1.0。