none
用RenderTargetBitmap 呈现Viewport3D模糊! RRS feed

  • 问题

  • 用RenderTargetBitmap 呈现Viewport3D内容,当Viewport3D中的内容较为复杂,比如分层叠加显示内容(几何曲面材质为SpecularMaterial表示透明时),所存储的图片文件和呈现在屏幕上的内容不一致,图片文件极为模糊,甚至个别处内容面目全非.请问如何解决?
    korn
    2009年8月13日 4:03

全部回复

  • 同志们有何建议?


    korn
    2009年8月14日 3:42
  • Hmm, 对3D不是很熟悉,把代码贴出来,也许可以找到其他人帮你
    2009年8月17日 10:05
  • 你好,

    请把一个较完整的sample贴出来看看,我们比较好分析。

    谢谢。
    Jim Zhou -MSFT
    2009年8月18日 7:16
    版主
  • 你好,

    请把一个较完整的sample贴出来看看,我们比较好分析。

    谢谢。
    Jim Zhou -MSFT
    代码关键部分如下:
                    BitmapEncoder encoder =  new JpegBitmapEncoder();
                    //建立将可视对象vpt(Viewport3D实例)转化为位图的对象
                    RenderTargetBitmap bmpRender = new RenderTargetBitmap(Convert.ToInt32(output.ActualWidth), Convert.ToInt32(output.ActualHeight + grid.RowDefinitions[0].ActualHeight), 96 * 1.0, 96 * 1.0, PixelFormats.Default);// 
                    //呈现图形到屏幕,此处vpt是Viewport3D实例,专门用于显示三位图形
                    vpt.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.ApplicationIdle, new DspChange(DrawWaveSurface), false); 
                    //呈现图形到位图
                    bmpRender.Render(vpt);
                    //位图存入encoder
    								encoder.Frames.Add(BitmapFrame.Create(bmpRender));
    								//存入文件
                    FileStream picStream = new FileStream("d:\\jpgfiles\\abc.jpg", FileMode.Create);
                    encoder.Save(picStream); picStream.Close();
    

    korn
    2009年8月19日 3:17
  • 据微软技术文档说,RenderTargetBitmap.Render(...)函数完全由GDI计算完成,没有用到显卡的性能。是否由于该原因导致存储图片失真?如果果真如此,那如何解决呀,有没有其它变通的方法?
    另外:用Hypersnap截屏得到的图片完全没有问题,不失真。也就是说可否采用某种办法截取屏幕上的图形,不过这可能又会涉及到图片同步问题!?!尽量不要遮掩做呀!
    korn
    2009年8月19日 6:44
  • 3D我不是很懂,不过从原理上讲,如果截屏没有问题,那就说明程序本身在设计上肯定没有问题,而且运行过程中也没有问题。我的想法是,你开发的这个软件是否则其它机器上,特别是不同配置的机器上运行过,是否有可能是你机器的配置或显卡驱动、设置之类的问题。

    2009年8月19日 12:49
  • 你的代码中用的是PixelFormats.Default,MSDN的备注: 从技术上讲,Default 不是像素格式,而是一种访问最适合特定操作的像素格式的方式。此格式用于特定像素格式并不重要的情况。 按你的情况,是不是应该指定比较高的像素格式呢?像PixelFormats.Rgba64,位数比较高,是不是效果更好呢?
    2009年12月8日 8:52