在UWP中正确控制渲染

时间:2019-01-16 21:50:21

标签: c# image uwp rendering

我正在实现自己的3D渲染算法,该算法最终将输出2D“像素”集,其中每个像素均为RGB值。看起来可能像这样:

int pixels[][]

我将使用哪种XAML控件将这些数据A)静态显示为图像,并将B)实时显示?

在概念上,我对静态图像的最初想法是将数据输出为位图,然后使用Image控件将源设置为该位图。因此可能看起来像这样:

int pixels[][] = renderer.Render(sceneData);
Bitmap image = new Bitmap(pixels);
MyImageControl.Source = image;

这可行吗? “位图”的正确类别是什么?我很难找到一个。我希望能够单独操纵像素值。

对于第二个问题,实时,只是在上面放置了相同的代码,但进入了每秒(理想情况下)执行30至60次或更多次的循环,然后输出将更像是视频,而不是单个静止图像。根据我过去的UWP和C#经验,似乎反复设置Source控件的Image属性对此太慢了。

我可以使用现有的API来执行诸如处理图像数据,显示图像或转换其格式的操作,但是此练习的目的是让我编写自己的渲染器...所以我需要翻译输入数据变成自己的最后一组“像素”。我不能为此使用DirectX或其他现有渲染器。

1 个答案:

答案 0 :(得分:1)

对于您的第一个要求,

  

“位图”的正确类别是什么?

您尝试使用CanvasBitmap吗?它具有静态方法,例如:

CreateFromBytes(ICanvasResourceCreator,Byte[], Int32, Int32, DirectXPixelFormat);

您应该使用Byte[]而不是int[]来获取颜色信息,这是合乎逻辑的。

它还有一种获取原始像素数据的方法:

public byte[] GetPixelBytes()
  

我希望能够单独操纵像素值。

CanvasBitmap也具有以下方法来直接设置像素数据(来自doc:):

  1. SetPixelBytes(Byte[])设置指定数组中位图的字节数据。

  2. SetPixelBytes(IBuffer)设置来自指定缓冲区的位图的字节数据。

  3. SetPixelBytes(Byte[], Int32, Int32, Int32, Int32)设置位图子区域的字节数据。

  4. SetPixelBytes(IBuffer, Int32, Int32, Int32, Int32)设置指定缓冲区中位图的子区域的字节数据。

您的第二个要求:

您需要实时显示视频吗?还是只是生成视频?有solution用于生成视频,但不能用于实时显示。