我正在实现自己的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或其他现有渲染器。
答案 0 :(得分:1)
对于您的第一个要求,
“位图”的正确类别是什么?
您尝试使用CanvasBitmap
吗?它具有静态方法,例如:
CreateFromBytes(ICanvasResourceCreator,Byte[], Int32, Int32, DirectXPixelFormat);
您应该使用Byte[]
而不是int[]
来获取颜色信息,这是合乎逻辑的。
它还有一种获取原始像素数据的方法:
public byte[] GetPixelBytes()
我希望能够单独操纵像素值。
CanvasBitmap
也具有以下方法来直接设置像素数据(来自doc:):
SetPixelBytes(Byte[])
设置指定数组中位图的字节数据。
SetPixelBytes(IBuffer)
设置来自指定缓冲区的位图的字节数据。
SetPixelBytes(Byte[], Int32, Int32, Int32, Int32)
设置位图子区域的字节数据。
SetPixelBytes(IBuffer, Int32, Int32, Int32, Int32)
设置指定缓冲区中位图的子区域的字节数据。
您的第二个要求:
您需要实时显示视频吗?还是只是生成视频?有solution用于生成视频,但不能用于实时显示。