1

我试图在OpenGLControl不使用OpenGLDraw eventhandler. 这样做的原因是我将它用于增强现实并且相机正在使用外部触发器,所以我想在相机输入新帧时进行绘制。在示例中,我使用了一个计时器来模拟相机。

我尝试了以下方法:

<Window x:Class="Example1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Test" Height="400" Width="600"
        xmlns:sharpGL="clr-namespace:SharpGL.WPF;assembly=SharpGL.WPF">
    <Grid>
        <sharpGL:OpenGLControl
            x:Name="glControl"          
            OpenGLInitialized="OpenGLControl_OpenGLInitialized"
            RenderContextType="DIBSection"
            DrawFPS="True"/>
    </Grid>
</Window>

以及背后的代码:

using System.Windows;
using SharpGL;
using SharpGL.SceneGraph;
using System.Timers;

namespace Example1
{
    public partial class MainWindow : Window
    {
        Timer clock = new Timer(1000f / 60f);
        float rotatePyramid = 0;

        public MainWindow()
        {
            InitializeComponent();
        }
        private void OpenGLControl_OpenGLInitialized(object sender, OpenGLEventArgs args)
        {
            OpenGL gl = args.OpenGL;
            gl.Enable(OpenGL.GL_DEPTH_TEST);

            clock.Elapsed += OnFrame;
            clock.Start();
        }

        private void OnFrame(object sender, ElapsedEventArgs e)
        {

            OpenGL gl = glControl.OpenGL;

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

            //  Reset the modelview matrix.
            gl.LoadIdentity();

            //  Move the geometry into a fairly central position.
            gl.Translate(0f, 0.0f, -6.0f);

            //  Draw a pyramid. First, rotate the modelview matrix.
            gl.Rotate(rotatePyramid, 0.0f, 1.0f, 0.0f);

            //  Start drawing triangles.
            gl.Begin(OpenGL.GL_TRIANGLES);

            gl.Color(1.0f, 0.0f, 0.0f);
            gl.Vertex(0.0f, 1.0f, 0.0f);
            gl.Color(0.0f, 1.0f, 0.0f);
            gl.Vertex(-1.0f, -1.0f, 1.0f);
            gl.Color(0.0f, 0.0f, 1.0f);
            gl.Vertex(1.0f, -1.0f, 1.0f);

            gl.Color(1.0f, 0.0f, 0.0f);
            gl.Vertex(0.0f, 1.0f, 0.0f);
            gl.Color(0.0f, 0.0f, 1.0f);
            gl.Vertex(1.0f, -1.0f, 1.0f);
            gl.Color(0.0f, 1.0f, 0.0f);
            gl.Vertex(1.0f, -1.0f, -1.0f);

            gl.Color(1.0f, 0.0f, 0.0f);
            gl.Vertex(0.0f, 1.0f, 0.0f);
            gl.Color(0.0f, 1.0f, 0.0f);
            gl.Vertex(1.0f, -1.0f, -1.0f);
            gl.Color(0.0f, 0.0f, 1.0f);
            gl.Vertex(-1.0f, -1.0f, -1.0f);

            gl.Color(1.0f, 0.0f, 0.0f);
            gl.Vertex(0.0f, 1.0f, 0.0f);
            gl.Color(0.0f, 0.0f, 1.0f);
            gl.Vertex(-1.0f, -1.0f, -1.0f);
            gl.Color(0.0f, 1.0f, 0.0f);
            gl.Vertex(-1.0f, -1.0f, 1.0f);

            gl.End();
            gl.Flush();

            rotatePyramid += 3.0f;
        }
    }
}

这只会渲染一个带有 FPS 计数器的黑屏。我认为这与没有获得正确的 OpenGL 对象有关。我真的很想使用 MVVM 模式并使用绑定,但如果这不可能,那么后面的代码也可以工作,只要我可以在从相机获取帧时进行绘制。

4

0 回答 0