我的目标是将没有窗口的OpenGL场景直接渲染到文件中.场景可能比我的屏幕分辨率大.
我怎样才能做到这一点?
我希望能够选择任何大小的渲染区域大小,例如10000x10000,如果可能的话?
是否有任何替代方法可以使用getframe
和saveas
将图形内容保存到光栅图像中以进行进一步处理?
方法1: getframe
h = figure('visible', 'off');
a = axes('parent', h);
% render using `scatter3()` or other plot function.
content = frame2im(getframe(h));
Run Code Online (Sandbox Code Playgroud)
这具有显示图形在调用中执行屏幕捕获的严重缺点,getframe()
并且当在循环中执行这样的渲染时(即,content
在每次迭代时将其保存为视频帧)存在问题.
方法2: saveas
h = figure('visible', 'off');
a = axes('parent', h);
% render using `scatter3()` or other plot function.
saveas(h, '/path/to/file.png');
content = imread(/path/to/file.png');
Run Code Online (Sandbox Code Playgroud)
这种方法具有写入磁盘的严重缺点,这在多线程应用程序中存在问题,并且比直接渲染到内存要慢.因为saveas()
在调用PNG编码器之前显然会渲染到内存,所以我想要的是可能的,但我在MATLAB文档中找不到任何只执行渲染部分的函数.
问题:
您是否知道将任意axes
内容渲染到光栅图像的替代方法?
我正在开发一个Android应用程序.我有一个活动,比如A,它用整个屏幕填充视图.在AI中按下一个按钮想要开始另一个活动,比如B,它也有一些视图和控件.我希望活动B在屏幕外,并希望从A获取B的屏幕截图.可能吗?
注意:我通过将绘图缓存保存到位图中来成功获取页面A的屏幕截图,但很难获取屏幕外页面的屏幕截图.
我原来的问题:
我正在创建一个简单的绘图应用程序,需要能够绘制我现有的,先前绘制的内容
drawRect
.在不完全替换现有内容的情况下绘制现有内容的正确方法是什么?
根据这里和其他地方收到的答案,这是交易.
您应该准备好在drawRect
调用时重绘整个矩形.
您无法通过执行以下操作来阻止内容被删除:
[self setClearsContextBeforeDrawing: NO];
这仅仅是对图形引擎的暗示,没有必要让它为您预先清除视图,因为您可能需要重新绘制整个区域.它可能会阻止您的视图被自动删除,但您不能依赖它.
要在不擦除的情况下在视图上绘制,请将绘图绘制到屏幕外位图上下文(系统永远不会清除它).然后在您drawRect
的屏幕外缓冲区中复制到视图.
例:
- (id) initWithCoder: (NSCoder*) coder {
if (self = [super initWithCoder: coder]) {
self.backgroundColor = [UIColor clearColor];
CGSize size = self.frame.size;
drawingContext = [self createDrawingBufferContext: size];
}
return self;
}
- (CGContextRef) createOffscreenContext: (CGSize) size {
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(NULL, size.width, size.height, 8, size.width*4, colorSpace, kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colorSpace);
CGContextTranslateCTM(context, 0, size.height);
CGContextScaleCTM(context, 1.0, -1.0); …
Run Code Online (Sandbox Code Playgroud) 我想弄清楚为屏幕外渲染创建无窗口OpenGL程序的最简单方法是什么.
目前我使用它,到目前为止工作正常:(为清晰起见,此处删除了错误检查)
BOOL create_opengl_context(){
GLuint PixelFormat;
static PIXELFORMATDESCRIPTOR pfd;
hDC = GetDC(NULL);
PixelFormat = ChoosePixelFormat(hDC, &pfd);
SetPixelFormat(hDC, PixelFormat, &pfd);
hRC = wglCreateContext(hDC);
wglMakeCurrent(hDC, hRC);
}
Run Code Online (Sandbox Code Playgroud)
这样安全吗?创建无窗口OpenGL程序的"标准"方法是什么?
编辑:我正在使用FBO进行屏幕外渲染.
我想在屏幕外渲染一个控件到一些位图,以便我可以快速访问它.
不幸的是,Control.DrawToBitmap
似乎绘制了它所调用的整个控件,包括它的所有子控件.在内部,它向位图发出带有自提供DC的WM_PRINT消息.然后将此临时位图blitting到用户提供的位图.对我来说不可接受,我宁愿根据需要更新这个位图,以便在需要位图时最小化我的性能.
在理想情况下,我希望表单的行为就像它在屏幕上可见(但它不可能).这意味着,如果某个控件的Text
属性发生了变化,则表单将部分失效.然后,捕获相关的消息/事件将允许我为要绘制的表单指定我自己的DC,或者简单地将表单DC BitBlt到我自己的DC.
我看过的一些方向:
PaintEventArgs
参数OnPaint
似乎举行成员savedGraphicsState,也许它可以用来找出不需要无效我的视图完全位于屏幕之外,我试图将其设置为屏幕上的动画.
我打电话的时候:
view.startAnimation(tA);
Run Code Online (Sandbox Code Playgroud)
没有任何反应,tA.initialize和tA.applyTransformation永远不会被调用.
如果我在开始动画之前移动视图以使其中任何部分可见,则动画可以正常工作.
当视图位于父视图之外时,什么阻止视图被动画?
我想用FBO进行屏幕外渲染(在没有任何WS的控制台环境中).我知道有必要创建一个OpenGL上下文,并且至少有一个虚拟窗口用于任何操作,因此我做了以下初始化:
// Step 1 - Get the default display.
eglDisplay = eglGetDisplay((EGLNativeDisplayType)0);
// Step 2 - Initialize EGL.
EGLint iMajorVersion, iMinorVersion;
if (!eglInitialize(eglDisplay, &iMajorVersion, &iMinorVersion))
{
printf("Error: eglInitialize() failed.\n");
goto cleanup;
}
// Step 3 - Make OpenGL ES the current API.
eglBindAPI(EGL_OPENGL_ES_API);
if (!TestEGLError("eglBindAPI"))
{
goto cleanup;
}
// Step 4 - Specify the required configuration attributes.
EGLint pi32ConfigAttribs[5];
pi32ConfigAttribs[0] = EGL_SURFACE_TYPE;
pi32ConfigAttribs[1] = EGL_WINDOW_BIT;
pi32ConfigAttribs[2] = EGL_RENDERABLE_TYPE;
pi32ConfigAttribs[3] = EGL_OPENGL_ES2_BIT;
pi32ConfigAttribs[4] = EGL_NONE;
// Step 5 - Find …
Run Code Online (Sandbox Code Playgroud) 我有一个WebViews滑块,每个WebView完全符合屏幕尺寸.用户可以从左向右滚动,反之亦然.
当WebView从未显示在可见区域之前出现问题.它的内容是预先加载的,但整个表面都是空白几毫秒,直到Android知道它变得可见并显示其内容.
因为一张图片胜过千言万语:
每次添加视图时我都会执行"requestLayout".我试图使它们无效,甚至做一个假卷轴......但没有成功.
目标API级别为17.
我有一个"屏幕外"的UIView层次结构,我希望在屏幕的不同位置进行渲染.此外,应该可以仅显示此视图层次结构的一部分,并且应该反映对此层次结构所做的所有更改.
困难:
UIView
方法drawHierarchy(in:afterScreenUpdates:)
始终调用draw(_ rect:)
,因此对于大型层次结构而言效率非常低.您必须在每次屏幕更新时重绘它或观察所有视图的所有更改属性.绘制视图层次结构文档UIView
方法snapshotView(afterScreenUpdates:)
也没有多大帮助,因为如果此层次结构是"屏幕外",我还没有找到获得正确视图层次结构图的方法.快照视图文档"屏幕外":此视图层次结构的根视图不是应用程序UI的一部分.它没有超级视图.
您可以在下面看到我的想法的直观表示: