0

openGLESでテクスチャを正方形にマッピングできないことに悩まされています。画面にjpg画像を表示しようとしていますが、そのために、画像をマッピングしたい正方形を描画します。ただし、出力として取得するのは白い正方形だけです。何が間違っているのかわかりません。そして、この問題は私が私のプロジェクトを進めることを妨げています。WindowsMo​​bile用のManagedOpenGLESラッパーを使用しています。テクスチャが正しく読み込まれていることを確認しましたが、オブジェクトに適用できません。問題を示すサンプルプロジェクトをここにアップロードしました。実行するには、Windows Mobile6SDKを搭載したVS2008が必要です。ここに、オブジェクトをレンダリングおよびテクスチャリングするフォームのコードも投稿しています。私はこの問題にしばらく立ち往生していて、何が間違っているのか理解できないので、どんな提案でも大歓迎です。

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

4 に答える 4

2

テクスチャリングを有効にする必要があります。

glEnable( GL_TEXTURE_2D );

正方形をレンダリングする前に。

于 2009-01-24T19:19:29.010 に答える
1

UIImage、CGImage、およびCGContextを使用してPNGまたはJPGファイルからテクスチャをロードする場合、テクスチャを作成する前にGL_TEXTURE_MIN_FILTERをGL_LINEARまたはGL_NEARESTに設定することが非常に重要です。これを行わないと、最後のバインドを除くすべてのテクスチャが空白の白に設定します。

于 2009-09-02T17:06:42.567 に答える
1

OpenGL|ES を使用している場合は、glDrawTexImage-Extension がサポートされているかどうかも確認してください (そうすべきです。これはコア拡張であり、必須ですが、わかりません...)

問題を直接解決することはできませんが (たとえば、テクスチャリングも有効にする必要があります)、glDrawTexImage はポリゴン レンダリングよりもはるかに効率的です。また、記述するコードも少なくて済みます。

于 2009-01-24T21:01:41.987 に答える
0

助けてくれてありがとう!しかし、あなたの提案は問題を解決しませんでした。これで、正方形は白ではなく黒になりましたが、テクスチャはありません。可能なすべての位置にgl.Enable(gl.GL_TEXTURE_2D)を追加しようとしましたが、結果はまだ黒い四角です。

編集:Upps、申し訳ありませんが、私の画像の左上隅が黒だったので、何も表示されませんでした。画像を異なる色に変更し、レンダリングされた画像の一部を確認できるようになりました。適切にマッピングされていませんが、その部分は理解できます。たくさんの助けに感謝します!!!

于 2009-01-24T20:02:58.313 に答える