1

gl.VertexPointer() と gl.DrawArrays() を使用して、SharpGL を使用して WPF アプリケーションでレンダリングしようとしています。しかし、正方形をレンダリングすることはできません。背景が緑色にクリアされ、WPF パネルの左下に FPS の描画が表示されます。正方形のコードを追加すると、FPS テキストも消えて、空白の画面が表示されます。

私は、問題なく動作する C++ プロジェクトで行っているのとまったく同じことを行っています。何が欠けているのか、間違っているのかわかりません。

XAML

<Window x:Class="NodePlusPlus.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:NodePlusPlus"
        xmlns:gl="clr-namespace:SharpGL.WPF;assembly=SharpGL.WPF"
        mc:Ignorable="d"
        Title="MainWindow" Height="900" Width="1600" Background="#FF202020">
    <Grid x:Name="MainGrid">
        
        <gl:OpenGLControl x:Name="glPanel" DrawFPS="True" />

    </Grid>
</Window>

C#

        public MainWindow()
        {
            InitializeComponent();

            glPanel.OpenGLInitialized += glPanel_OpenGLInitialized;
            glPanel.OpenGLDraw += glPanel_OpenGLDraw;
            glPanel.Resized += glPanel_Resized;
        }

        private void glPanel_Resized(object sender, SharpGL.WPF.OpenGLRoutedEventArgs args)
        {
            OpenGL gl = args.OpenGL;
            gl.Ortho2D(0, Width, 0, Height);
        }

        private void glPanel_OpenGLInitialized(object sender, SharpGL.WPF.OpenGLRoutedEventArgs args)
        {
            OpenGL gl = args.OpenGL;

            gl.Hint(OpenGL.GL_PERSPECTIVE_CORRECTION_HINT, OpenGL.GL_FASTEST);
            gl.ShadeModel(OpenGL.GL_SMOOTH);
            gl.Enable(OpenGL.GL_CULL_FACE);
            gl.Enable(OpenGL.GL_TEXTURE_2D);
            gl.Enable(OpenGL.GL_BLEND);
            gl.Enable(OpenGL.GL_DEPTH_TEST);
            gl.BlendFunc(OpenGL.GL_SRC_ALPHA, OpenGL.GL_ONE_MINUS_SRC_ALPHA);
            gl.EnableClientState(OpenGL.GL_VERTEX_ARRAY);
            gl.EnableClientState(OpenGL.GL_TEXTURE_COORD_ARRAY);
            gl.ClearColor(0.0f, 1.0f, 0.0f, 0.1f);
        }

        private void glPanel_OpenGLDraw(object sender, SharpGL.WPF.OpenGLRoutedEventArgs args)
        {
            OpenGL gl = args.OpenGL;

            // Clear the color and depth buffers
            gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
            gl.LoadIdentity();
            
            // Build a rectangle
            float Width     = 100.0f;
            float Height    = 100.0f;
            float[] vertices = new float[18];
            vertices[0]  = 0;       vertices[1] = 0;        vertices[2] = 0.0f;
            vertices[3]  = 0;       vertices[4] = Height;   vertices[5] = 0.0f;
            vertices[6]  = Width;   vertices[7] = Height;   vertices[8] = 0.0f;

            vertices[9]  = 0;       vertices[10] = 0;       vertices[11] = 0.0f;
            vertices[12] = Width;   vertices[13] = Height;  vertices[14] = 0.0f;
            vertices[15] = Width;   vertices[16] = 0;       vertices[17] = 0.0f;


            // If I remove this whole Begin()-End() section, it will render the Open GL FPS.  With this draw code here, it does not render the FPS.
            gl.Begin(OpenGL.GL_TRIANGLES);

            gl.Translate(0.0f, 0.0f, 0.0f);
            gl.Color(0.0f, 0.0f, 0.0f, 1.0f);
            gl.VertexPointer(3, 0, vertices);
            gl.DrawArrays(OpenGL.GL_TRIANGLES, 0, 6);

            gl.End();

            gl.Flush();
        }

ドローコードで... OpenGL ドロー

ドローコードなしで... OpenGL ノードロー

4

1 に答える 1

1

@BDL で言及されているように、この場合は使用されませんglBegin()glEnd()

@ Rabbid76 で述べたように、glEnableClientState(OpenGL.GL_TEXTURE_COORD_ARRAY)テクスチャ座標を使用していないため、削除する必要があります。

助けてくれてありがとう!

gl.Enable(OpenGL.GL_CULL_FACE)また、特定の例では、正方形を描画するために削除が必要でした。@ Rabbid76 が述べたように、デフォルトの巻き上げ順序は反時計回りです。私の頂点は時計回りに曲がりくねっています。

最終結果

        private void glPanel_OpenGLInitialized(object sender, SharpGL.WPF.OpenGLRoutedEventArgs args)
        {
            OpenGL gl = args.OpenGL;

            gl.Hint(OpenGL.GL_PERSPECTIVE_CORRECTION_HINT, OpenGL.GL_FASTEST);
            gl.ShadeModel(OpenGL.GL_SMOOTH);
            gl.Enable(OpenGL.GL_TEXTURE_2D);
            gl.Enable(OpenGL.GL_BLEND);
            gl.Enable(OpenGL.GL_DEPTH_TEST);
            gl.BlendFunc(OpenGL.GL_SRC_ALPHA, OpenGL.GL_ONE_MINUS_SRC_ALPHA);
            gl.EnableClientState(OpenGL.GL_VERTEX_ARRAY);
            gl.ClearColor(0.0f, 1.0f, 0.0f, 0.1f);
        }

        private void glPanel_OpenGLDraw(object sender, SharpGL.WPF.OpenGLRoutedEventArgs args)
        {
            OpenGL gl = args.OpenGL;

            // Clear the color and depth buffers
            gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
            gl.LoadIdentity();
            
            // Build a rectangle
            float Width     = 100.0f;
            float Height    = 100.0f;
            float[] vertices = new float[18];
            vertices[0]  = 0;       vertices[1] = 0;        vertices[2] = 0.0f;
            vertices[3]  = 0;       vertices[4] = Height;   vertices[5] = 0.0f;
            vertices[6]  = Width;   vertices[7] = Height;   vertices[8] = 0.0f;

            vertices[9]  = 0;       vertices[10] = 0;       vertices[11] = 0.0f;
            vertices[12] = Width;   vertices[13] = Height;  vertices[14] = 0.0f;
            vertices[15] = Width;   vertices[16] = 0;       vertices[17] = 0.0f;

            gl.Translate(0.0f, 0.0f, 0.0f);
            gl.Color(0.0f, 0.0f, 0.0f, 1.0f);
            gl.VertexPointer(3, 0, vertices);
            gl.DrawArrays(OpenGL.GL_TRIANGLES, 0, 6);

            gl.Flush();
        }
于 2021-12-11T22:21:27.447 に答える