1

私は C# で (SharpGL を使用して) OpenGL をいじっていますが、私は DirectX のバックグラウンドを持っています... OpenGL はかなり似ていると思いました。 2D 画像を水平方向に少し引き延ばします (Lena を非常に肥大化させます)。

私の問題はオルソ投影に起因していると思いますが、私は肯定的ではありません.draw関数に投影を詰め込んで、期待どおりに機能していることを確認しました。テクスチャは頂点に正しくレンダリングされており、画像は BMP として 512:512 です (C# にプルしたときに検証済み)。

おそらく誰かが私のコードを見て、私を助けてくれるでしょうか? このコードのほとんどを他の例からコピーし、少しいじったので、これが私の最新の化身です。

    private bool TexturesInitialised = false;
    private Bitmap gImage1;
    private System.Drawing.Imaging.BitmapData gbitmapdata;
    private uint[] gtexture = new uint[1];

    private void InitialiseTexture(ref OpenGL gl)
    {
        gImage1 = new Bitmap(@"C:\Users\SJ\Pictures\lenaV.bmp");

        Rectangle rect = new Rectangle(0, 0, gImage1.Width, gImage1.Height);
        gbitmapdata = gImage1.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
        gImage1.UnlockBits(gbitmapdata);
        gl.GenTextures(1, gtexture);
        gl.BindTexture(OpenGL.GL_TEXTURE_2D, gtexture[0]);
        gl.TexImage2D(OpenGL.GL_TEXTURE_2D, 0, (int)OpenGL.GL_RGBA, gImage1.Width, gImage1.Height, 0, OpenGL.GL_BGR_EXT, OpenGL.GL_UNSIGNED_BYTE, gbitmapdata.Scan0);

        gl.TexParameter(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MIN_FILTER, OpenGL.GL_LINEAR);
        gl.TexParameter(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MAG_FILTER, OpenGL.GL_LINEAR);

        TexturesInitialised = true;
    }

    private void openGLControl_OpenGLDraw(object sender, RenderEventArgs e)
    {
        //  Get the OpenGL object.
        OpenGL gl = openGLControl.OpenGL;

        //  Clear the color and depth buffer.
        gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);

        //  Load the identity matrix.
        gl.LoadIdentity();

        if (!TexturesInitialised)
        {
            InitialiseTexture(ref gl);
        }

        gl.Enable(OpenGL.GL_TEXTURE_2D);
        gl.BindTexture(OpenGL.GL_TEXTURE_2D, gtexture[0]);
        gl.Color(1.0f, 1.0f, 1.0f, 0.1f);
        gl.Begin(OpenGL.GL_QUADS);

        gl.TexCoord(1.0f, 1.0f);
        gl.Vertex(gImage1.Width, gImage1.Height, 1.0f);

        gl.TexCoord(0.0f, 1.0f);
        gl.Vertex(0.0f, gImage1.Height, 1.0f);

        gl.TexCoord(0.0f, 0.0f);
        gl.Vertex(0.0f, 0.0f, 1.0f);

        gl.TexCoord(1.0f, 0.0f);
        gl.Vertex(gImage1.Width, 0.0f, 1.0f);

        gl.End();
        gl.Disable(OpenGL.GL_TEXTURE_2D);

        gl.MatrixMode(OpenGL.GL_PROJECTION);
        gl.LoadIdentity();
        gl.Ortho(0.0, (double)gImage1.Width, (double)gImage1.Height, 0.0, -1.0, 1.0);
        gl.MatrixMode(OpenGL.GL_MODELVIEW);
        gl.Disable(OpenGL.GL_DEPTH_TEST);
    }

    private void openGLControl_OpenGLInitialized(object sender, EventArgs e)
    {
        //  Get the OpenGL object.
        OpenGL gl = openGLControl.OpenGL;

        //  Set the clear color.
        gl.ClearColor(0, 0, 0, 0);
    }

    private void openGLControl_Resized(object sender, EventArgs e)
    {
        OpenGL gl = openGLControl.OpenGL;
        gl.MatrixMode(OpenGL.GL_PROJECTION);
        gl.LoadIdentity();
        if (!TexturesInitialised)
        {
            gl.Ortho(-1, 1, -1, 1, -1, 1);
        }
        else
        {
            gl.Ortho(0, gImage1.Width, gImage1.Height, 0, -1, 1);
        }
        gl.MatrixMode(OpenGL.GL_MODELVIEW);
        gl.Disable(OpenGL.GL_DEPTH_TEST);
    }
4

1 に答える 1

1

これは GeirGrusom の功績によるものです。変更は設定と同じくらい簡単でした:

gl.Ortho(0.0, (double)gImage1.Width, (double)gImage1.Height, 0.0, -1.0, 1.0);

に:

gl.Ortho(0.0, (double)openGLControl.Width, (double)openGLControl.Height, 0.0, -1.0, 1.0);
于 2015-02-26T15:52:38.940 に答える