我试图在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 模式并使用绑定,但如果这不可能,那么后面的代码也可以工作,只要我可以在从相机获取帧时进行绘制。