1

我对 OpenGL 很陌生,我正在使用为 Windows Mobile 手机(OpenGLES Windows Mobile)编写的托管 OpenGLES 包装器。我有一个简单的任务是绘制一个正方形(得到那个)并用磁盘中的图像对其进行纹理化,所以我基本上只想在屏幕上显示一个 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);
4

2 回答 2

2

您尚未启用 GL_TEXTURE_2D - 添加此行

gl.glEnable(gl.GL_TEXTURE_2D)
于 2009-12-18T14:34:58.840 回答
0

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

于 2009-02-16T14:47:54.620 回答