我无法设法使 Matlab 新图形引擎 (HG2) 以可靠的方式显示线条和标记,这意味着在轴/屏幕的任何地方都以相同的方式显示/渲染。
为了演示这个问题,我编写了一个简单的脚本(见帖子末尾),并比较了 R2014a(使用 Matlab 旧 HG1 引擎)与 R2016b(因此使用 Matlab 新 HG2 引擎)下的结果,用于画家和opengl渲染器。
(您可能会在脚本中注意到,我已尝试停用我所知道的任何类型的 HG2 平滑。尽管这确实会有所改变,但无论是否停用平滑,都会发生所描述的一般问题行为。)
(恐怕SO正在调整图像的大小,这会导致问题,所以这里是图像本身的直接链接)
R2014a (HG1) 和画家渲染器:如果你放大图像,你可以检查每个标记是否像素完美——无论它们在哪里绘制,它们都是绝对相同的。每条绿线正好是 1 像素宽。
R2014a (HG1) 和 opengl 渲染器:每条绿线正好是 1 像素宽,但标记的显示/绘制不完全相同。
R2016b (HG2) 和画家渲染器:奇怪的是,结果与 HG1 和 opengl 相似。线条的宽度是正确的(显示的与 HG1 中的有所不同,但至少它们是一致的),但标记在整个轴上有所不同。
R2016b (HG2) & opengl 渲染器:标记都是相同的(虽然我不太喜欢它们,这是一个主观问题,重要的是它们都是相同的),但是你可以看到三个绿线并不是所有的预期宽度of 1 pixel :顶部和底部的宽度为 2 像素,仅绘制了中间的宽度为 1 像素。
关于如何使两个渲染器中的任何一个在 HG2 中正确运行(即,无论它在图像中的哪个位置绘制相同的东西)的任何想法?
其他注意事项:
如果可能的话,我更喜欢使用opengl,因为出于某种原因,对于HG2 的“合理”数量的数据点(即数千个),画家似乎非常慢(至少是相机控制)。当然,除非您也知道如何在 HG2 中像在 HG1 中一样快速制作画家。
虽然测试代码很简单,但我实际上需要在一个非常复杂的 GUI(自定义 uimenu、uicontrols、面板、回调等)中使用它。虽然我不知道这可能很重要,但显然,例如,使用 uifigure 而不是图形的潜在解决方案对我来说是不可用的。
有关信息,这是我输入时得到的信息
opengl('info')
:
在 Matlab R2014a 中:
Version = 4.0.0 - Build 9.18.10.3131
Vendor = Intel
Renderer = Intel(R) HD Graphics 4600
MaxTextureSize = 8192
Visual = 05 (RGB 32 bits(08 08 08 08) zdepth 24, Hardware Accelerated, Opengl, Double Buffered, Window)
Software = false
# of Extensions = 139
Driver Bug Workarounds:
OpenGLBitmapZbufferBug = 0
OpenGLWobbleTesselatorBug = 0
OpenGLLineSmoothingBug = 0
OpenGLDockingBug = 0
OpenGLClippedImageBug = 0
OpenGLEraseModeBug = 0
在 Matlab R2016b 中:
Version: '1.1.0'
Vendor: 'Microsoft Corporation'
Renderer: 'GDI Generic'
MaxTextureSize: 1024
Visual: 'Visual 0x24, (RGB 24 bits (8 8 8), Z depth 16 bits, Software, Single buffer, Antialias 0 samples)'
Software: 'true'
HardwareSupportLevel: 'none (known graphics driver issues)'
SupportsGraphicsSmoothing: 0
SupportsDepthPeelTransparency: 0
SupportsAlignVertexCenters: 0
Extensions: {3×1 cell}
MaxFrameBufferSize: 0
使用的示例代码是:
rng(0)
data=rand(1,30);
DSKS=sort(data);
renderer='painters';
%renderer='opengl';
Name=[version ' - ' renderer];
try close(Name);end; %#ok<TRYNC>
h=figure('Name',Name,'NumberTitle','off');
if ~verLessThan('matlab','8.4.0')
set(gcf,'GraphicsSmoothing','off','DefaultTextFontSmoothing','off','DefaultAxesFontSmoothing','off')
end
set(gcf,'Renderer',renderer)
plot(DSKS,100*(1:length(DSKS))/length(DSKS),...
'Color','k','LineStyle','none','Marker','x','LineWidth',2,'MarkerSize',8);
hold on
ZEROX=0;ZEROY=0;
typique=0.5;
if ~isempty(typique)
plot([typique typique],[ZEROY 100],'r--','LineWidth',2)
end
plot([0 0],[0 100],'--','Color',0.7*[1 1 1],'LineWidth',2)
XL=get(gca,'XLim');XL2=[XL(1) max(XL(2),1)];
plot(XL2,[50 50],'r--','LineWidth',2)
plot(XL2,[68.27 68.27],'g--','LineWidth',1);
plot(XL2,[95.45 95.45],'g--','LineWidth',1);
plot(XL2,[99.73 99.73],'g--','LineWidth',1);
hold on
grid on
title(Name,'FontWeight','bold')