C# OpenGL中对正方形应用纹理的问题

C# OpenGL中对正方形应用纹理的问题,c#,.net,windows-mobile,opengl-es,C#,.net,Windows Mobile,Opengl Es,我被困在无法将纹理映射到openGLES中的正方形上。我试图在屏幕上显示一个jpg图像,为了做到这一点,我画了一个正方形,然后将图像映射到上面。然而,作为一个输出,我得到的只是一个白色的正方形。我不知道我做错了什么。这个问题阻碍了我继续我的项目。我正在使用Windows Mobile。 我验证了纹理是否正确加载,但无法将其应用于我的对象。我上传了显示我的问题的示例项目。您需要VS2008和Windows Mobile 6 SDK才能运行它。我还在这里发布了渲染和纹理对象的表单代码。任何建议都将不

我被困在无法将纹理映射到openGLES中的正方形上。我试图在屏幕上显示一个jpg图像,为了做到这一点,我画了一个正方形,然后将图像映射到上面。然而,作为一个输出,我得到的只是一个白色的正方形。我不知道我做错了什么。这个问题阻碍了我继续我的项目。我正在使用Windows Mobile。 我验证了纹理是否正确加载,但无法将其应用于我的对象。我上传了显示我的问题的示例项目。您需要VS2008和Windows Mobile 6 SDK才能运行它。我还在这里发布了渲染和纹理对象的表单代码。任何建议都将不胜感激,因为我已经被这个问题困扰了一段时间,我不知道我做错了什么

    public partial class Form1 : Form
{
    [DllImport("coredll")]
    extern static IntPtr GetDC(IntPtr hwnd);

    EGLDisplay myDisplay;
    EGLSurface mySurface;
    EGLContext myContext;

    public Form1()
    {
        InitializeComponent();
        myDisplay = egl.GetDisplay(new EGLNativeDisplayType(this));

        int major, minor;
        egl.Initialize(myDisplay, out major, out minor);

        EGLConfig[] configs = new EGLConfig[10];
        int[] attribList = new int[] 
        { 
            egl.EGL_RED_SIZE, 5, 
            egl.EGL_GREEN_SIZE, 6, 
            egl.EGL_BLUE_SIZE, 5, 
            egl.EGL_DEPTH_SIZE, 16 , 
            egl.EGL_SURFACE_TYPE, egl.EGL_WINDOW_BIT,
            egl.EGL_STENCIL_SIZE, egl.EGL_DONT_CARE,
            egl.EGL_NONE, egl.EGL_NONE 
        };

        int numConfig;
        if (!egl.ChooseConfig(myDisplay, attribList, configs, configs.Length, out numConfig) || numConfig < 1)
            throw new InvalidOperationException("Unable to choose config.");

        EGLConfig config = configs[0];
        mySurface = egl.CreateWindowSurface(myDisplay, config, Handle, null);
        myContext = egl.CreateContext(myDisplay, config, EGLContext.None, null);

        egl.MakeCurrent(myDisplay, mySurface, mySurface, myContext);
        gl.ClearColor(0, 0, 0, 0);
        InitGL();
    }

    void InitGL()
    {
        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);
    }

    public unsafe void DrawGLScene()
    {
        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();

        Texture myImage;
        Bitmap Image = new Bitmap(@"\Storage Card\Texture.jpg");
        using (MemoryStream ms = new MemoryStream())
        {
            Image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
            myImage = Texture.LoadStream(ms, false);
        }

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

    }

    protected override void OnPaintBackground(PaintEventArgs e)
    {

    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        gl.Clear(gl.GL_COLOR_BUFFER_BIT);

        DrawGLScene();
        egl.SwapBuffers(myDisplay, mySurface);
        gl.Clear(gl.GL_COLOR_BUFFER_BIT);
    }

    protected override void OnClosing(CancelEventArgs e)
    {
        if (!egl.DestroySurface(myDisplay, mySurface))
            throw new Exception("Error while destroying surface.");
        if (!egl.DestroyContext(myDisplay, myContext))
            throw new Exception("Error while destroying context.");
        if (!egl.Terminate(myDisplay))
            throw new Exception("Error while terminating display.");
        base.OnClosing(e);
    }
}
公共部分类表单1:表单
{
[DllImport(“coredll”)]
外部静态IntPtr GetDC(IntPtr hwnd);
电子显示屏;
EGLSurface-mySurface;
EGLContext-myContext;
公共表格1()
{
初始化组件();
myDisplay=egl.GetDisplay(新的EGLNativeDisplayType(this));
int大调、小调;
egl.初始化(myDisplay、out major、out minor);
EGLConfig[]configs=新的EGLConfig[10];
int[]属性列表=新int[]
{ 
egl.egl_红色_尺寸,5,
egl.egl_绿色_尺寸,6,
egl.egl_蓝色_尺寸,5,
egl.egl_深度_尺寸,16,
egl.egl_表面类型,egl.egl_窗口位,
egl.egl_模板尺寸,egl.egl_不在乎,
egl.egl_无,egl.egl_无
};
int numConfig;
如果(!egl.ChooseConfig(myDisplay,attribList,configs,configs.Length,out numConfig)| | numConfig<1)
抛出新的InvalidOperationException(“无法选择配置”);
EGLConfig config=configs[0];
mySurface=egl.createWindowsSurface(myDisplay,config,Handle,null);
myContext=egl.CreateContext(myDisplay,config,EGLContext.None,null);
例如MakeCurrent(myDisplay、mySurface、mySurface、myContext);
gl.ClearColor(0,0,0,0);
InitGL();
}
void InitGL()
{
gl.ShadeModel(gl.gl\u平滑);
gl.ClearColor(0.0f、0.0f、0.0f、0.5f);
gl.BlendFunc(gl.gl_SRC_ALPHA,gl.gl_ONE_减去SRC_ALPHA);
总账提示(总账透视图、更正提示、总账最佳);
}
公共不安全的无效场景()
{
gl.矩阵模式(gl.gl_投影);
gl.LoadIdentity();
gl.Orthof(0,ClientSize.Width,ClientSize.Height,0,0,1);
gl.Disable(gl.gl\U深度\U测试);
gl.MatrixMode(gl.gl\U模型视图);
gl.LoadIdentity();
纹理图像;
位图图像=新位图(@“\Storage Card\Texture.jpg”);
使用(MemoryStream ms=new MemoryStream())
{
保存(ms,System.Drawing.Imaging.ImageFormat.Bmp);
myImage=Texture.LoadStream(ms,false);
}
浮动[]矩形=新浮动[]{
0, 0,
myImage.Width,0,
0,myImage.Height,
myImage.Width,myImage.Height
};
浮点[]纹理位置=新浮点[]{
0, 0,
myImage.Width,0,
0,myImage.Height,
myImage.Width,myImage.Height
};
//绑定纹理
gl.BindTexture(gl.gl\u TEXTURE\u 2D,myImage.Name);
gl.TexParameteri(gl.gl\u纹理\u 2D、gl.gl\u纹理\u最小\u过滤器、gl.gl\u线性);
gl.TexParameteri(gl.gl\u纹理\u 2D、gl.gl\u纹理\u MAG\u过滤器、gl.gl\u线性);
gl.EnableClientState(gl.gl\u纹理\u坐标\u数组);
gl.EnableClientState(gl.gl\u顶点\u数组);
//画正方形并对其进行纹理处理。
已修复(浮点*矩形指针=&矩形[0],位置指针=&纹理位置[0])
{
gl.TexCoordPointer(2,gl.gl_浮点,0,(IntPtr)位置指针);
gl.VERTEXPINTER(2,gl.gl_浮点,0,(IntPtr)矩形指针);
gl.DrawArray(gl.gl_三角形_带,0,4);
}
gl.DisableClientState(gl.gl\u纹理\u坐标\u数组);
gl.DisableClientState(gl.gl\u顶点\u数组);
}
PaintBackground上受保护的覆盖无效(PaintEventArgs e)
{
}
受保护的覆盖无效OnPaint(PaintEventArgs e)
{
基础漆(e);
gl.Clear(gl.gl\U颜色\U缓冲\U位);
DrawGLScene();
例如SwapBuffers(myDisplay,mySurface);
gl.Clear(gl.gl\U颜色\U缓冲\U位);
}
关闭时受保护的覆盖无效(CancelEventArgs e)
{
如果(!egl.DestroySurface(myDisplay,mySurface))
抛出新异常(“销毁表面时出错”);
如果(!egl.DestroyContext(myDisplay,myContext))
抛出新异常(“销毁上下文时出错”);
如果(!egl.终止(myDisplay))
抛出新异常(“终止显示时出错”);
基数(e);
}
}

您需要启用纹理:

glEnable( GL_TEXTURE_2D );

渲染正方形之前。

需要启用纹理:

glEnable( GL_TEXTURE_2D );

在渲染正方形之前。

谢谢您的帮助!然而,你的建议并没有解决这个问题。现在正方形是黑色而不是白色,但仍然没有纹理。我尝试在每个可能的位置添加gl.Enable(gl.gl\u TEXTURE\u 2D),但结果仍然是黑色正方形

编辑: 对不起,我的照片左上角是黑色的,所以我什么都没看到。将图像更改为具有不同的颜色,现在我可以看到渲染的部分图像。它没有正确的映射,但我能找到那部分。
谢谢你们的帮助

谢谢你的帮助!然而,你的建议并没有解决这个问题。现在正方形是黑色而不是白色,但仍然没有纹理。我尝试在每个可能的位置添加gl.Enable(gl.gl\u TEXTURE\u 2D),但结果仍然是黑色正方形

编辑: 对不起,我的图片左上角是bla