问题标签 [off-screen]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2511 浏览

opengl - OpenGL render-to-texture-via-FBO -- 不正确的显示与正常的纹理

到纹理绑定的屏幕外帧缓冲区对象的屏幕外渲染应该是如此微不足道,但我遇到了一个问题,我无法绕开我的头。

我的完整示例程序(目前仅 2D!)在这里:

http://pastebin.com/hSvXzhJT

有关一些说明,请参见下文。

我正在创建一个 rgba 纹理对象 512x512,将其绑定到 FBO。此时不需要深度或其他渲染缓冲区,严格来说是 2D。

以下极其简单的着色器渲染到此纹理:

顶点着色器:

在 aPos 中,这只是获得一个包含 4 个 xy 坐标的四边形的 VBO (-1, -1 :: 1, -1 :: 1, 1 :: -1, 1)

因此,尽管帧缓冲区分辨率理论上应该是 512x512,但显然着色器将其“纹理”渲染到“全(关闭)屏幕四边形”,遵循 GLs -1..1 坐标范式。

片段着色器:

所以它设置了一个完全不透明的颜色,红色固定为 0.25,绿色/蓝色取决于 x/y 介于 0 和 1 之间的任何位置。

在这一点上,我的假设是渲染 512x512 纹理仅显示 -1..1 全(关闭)屏幕四边形,从 0..1 开始对绿色/蓝色进行片段着色。

所以这是我的屏幕外设置。在屏幕上,我有另一个真正可见的全屏四边形,具有 4 个 xyz 坐标 { -1, -1, 1 ::: 1, -1, 1 ::: 1, 1, 1 ::: -1, 1, 1}。同样,现在这是二维的,所以没有矩阵,所以 z 总是 1。

这个四边形由不同的着色器绘制,简单地渲染给定的纹理,教科书 GL-101 样式。在我上面链接的示例程序中,我有一个简单的布尔切换 doRtt,当它为 false(默认值)时,根本不执行渲染到纹理,并且此着色器仅显示使用当前目录中的 texture.jpg。

这种 doRtt=false 模式表明第二个屏幕四边形渲染器对于我当前的要求是“正确的”,并按照我的意愿执行纹理:垂直重复两次,水平重复两次(稍后将被钳制,重复只是为了测试此处),否则在没有纹理过滤或 mipmapping 的情况下进行缩放。

因此,无论窗口(以及视口)如何调整大小,我们总是会看到一个全屏四边形,其中单个纹理水平重复两次,垂直重复两次。

现在,使用 doRtt=true,第二个着色器仍然可以完成它的工作,但纹理从未完全正确缩放或绘制,这我不确定,因为不幸的是我们不能只说“嘿,将这个 FBO 保存到磁盘调试目的”。

RTT 着色器确实执行了一些部分渲染(或者可能是完整渲染,再次无法确定屏幕外发生了什么......)特别是当您将视口调整为比默认大小小很多时,您会看到纹理之间的中断重复,并不是我们非常简单的 RTT 片段着色器所期望的所有颜色都确实显示出来了。

(A) 要么:512x512 纹理是正确创建的,但我的代码没有正确映射(但是为什么使用完全相同的简单纹理四边形着色器使用 doRtt=false 的任何给定纹理.jpg 文件显示得很好?)

(B) 或: 512x512 纹理未正确渲染,并且 rtt 片段着色器以某种方式根据窗口分辨率改变其输出——但为什么呢?对于 x 和 y,屏幕外四边形始终为 -1..1,顶点着色器始终将其映射到片段坐标 0..1,对于这个简单的测试,RTT 纹理始终保持在 512x512!

请注意,屏幕外四边形和屏幕上四边形都不会改变它们的坐标,并且始终是“全屏”(两个维度均为-1..1)。

同样,这应该很简单。我到底错过了什么?

规格:OpenGL 4.2(但代码显然不需要任何 4.2 功能!),Nvidia Quadro 5010M,openSuse 12.1 64bit,Golang Weekly 2012 年 2 月 22 日。

0 投票
1 回答
1711 浏览

android - Android Canvas 离屏绘图性能

我正在使用Canvaselement 开发一个 Android 游戏。我在大型游戏地图上绘制了许多图形元素(精灵)。这些元素由标准图形函数绘制,如drawLine,drawPathdrawArc

测试它们是否在屏幕上并不难。所以,如果他们不在屏幕上,我可能会完全跳过他们的绘图程序。但即使这样也有 CPU 成本。我想知道是否Android Graphics Library可以比我更快地做到这一点?

简而言之,我是否应该尝试绘制所有内容,即使它们完全超出屏幕坐标,相信Android Graphics Library会照顾它们并且不会花费太多 CPU 来尝试绘制它们,或者我应该自己检查它们的绘图区域矩形以及它们是否完全超出屏幕,跳过绘图程序?哪个是正确的方法?哪个应该更快?

ps:我的目标是Android v2.1及以上。

0 投票
1 回答
1026 浏览

java - 创建“隐形”图形

在从图形类生成屏幕外图像并将它们转换为二进制数据而不将它们设置在屏幕上可见时,我需要您的帮助。我想生成大量标签并将它们作为二进制数据发送到打印机。如果我创建图像,在屏幕上显示然后发送它,一切都很好,但是我在一分钟内生成 100 个标签,当它们在我的 java 应用程序的屏幕上闪烁时很烦人。我希望它由单独的线程生成,没有明显的效果。
如果我不给他们看,标签是黑色的。我试图生成它们,然后在屏幕外展示它们,这与我的期望不符。有没有办法从 Graphics2d 生成“不可见”的图像?或者还有其他方法可以建议我吗?

提前谢谢你 Qba

0 投票
2 回答
456 浏览

android - 在显示活动窗口之前完成布局

我有以下场景:在活动A中,当用户单击按钮时,应用程序向服务器发送请求以检索一些信息,然后将这些信息放入启动活动B的意图中。

在活动 B 中,在onCreate方法中,我这样做setContentView(R.layout.activity_b)(这个布局非常复杂,所以即使从 XML 中膨胀它也需要一段时间),然后进行一堆初始化。最后,在onStart我对组件进行一些最后的准备/安排。

在活动 A 中,当用户按下按钮时,我启动一个AsyncTask,它从服务器获取信息并启动活动 B,将所需的信息传递给意图。当我调用“startActivity”时,活动 B 的窗口会立即滑入到位,但是可能需要几秒钟才能完成初始化。在这几秒钟内,我看到一个黑屏。然后,最后,onStart执行,一切继续。

我想做的是在活动 B 滑入视图之前在屏幕外完成所有这些初始化,这样当它“到达”时,所有布局都已经存在。任何想法如何实现这一目标?

0 投票
2 回答
861 浏览

objective-c - glReadPixels 读取“帧外”区域

我绘制 OpenGL 3200x2000 大小的纹理四边形。OpenGLView 帧大小设置为 940x560。它按应有的方式绘制四边形。当我尝试将其保存为图像(使用 glReadPixels)并将 glReadPixels 区域从(0,0)设置为(3200,2000)时发包。它创建 3200x2000 像素数据,但是当我将其保存到文件时,我看到小图像部分(从左下角 940x560)而整个其他区域都是黑色的。那么如何读取屏幕外区域呢?我尝试使用 Framebuffer,但它非常复杂,在创建它时出错等等......还有其他解决方案吗?


情况可视化:

原始图像如下所示(3200x2000): 在此处输入图像描述

OpenGLView 看起来像这样(940x560): 在此处输入图像描述

保存的图像看起来像这样(3200x2000): 在此处输入图像描述

0 投票
5 回答
62435 浏览

c++ - 如何在 OpenGL 上渲染屏幕外?

我的目标是将没有窗口的 OpenGL 场景直接渲染到文件中。场景可能比我的屏幕分辨率大。

我怎样才能做到这一点?

如果可能,我希望能够将渲染区域大小选择为任何大小,例如 10000x10000?

0 投票
1 回答
470 浏览

android - 如何在复杂的布局树中将视图设置为离屏?

我为平板电脑应用程序提供了以下布局结构:

第一个 LinearLayout 仅在左侧包含一个片段并且不可移动。第二个 LinearLayout 的第一个位置有一个不可见的元素,当我向左滑动另外两个 R.Layouts 时我会减少它,当我向后滑动时会增加。中间的 RelativeLayout 一直保持他的宽度,我可以在第一个 LinearLayout 上滑动第二个和第三个。实际上,第二个和第三个 R.Layout 应该具有相同的宽度,但第三个应该仅在屏幕边框处可见到 26%。

我现在想要做的是,第三个 R.Layout 的宽度与第二个从一开始(在应用程序启动后)的宽度相同,并且他的位置是屏幕外的一半。我试图做的是,创建一个布局,其宽度来自所有三个 R.Layouts 的总和并将布局放入其中,但它不起作用 - 我只看到第一个 LinearLayout 中的元素。当我在上面的代码中使用 weight 属性时,第三个 R.Lay 被拉伸,这正是我试图避免的行为。当我将Margin_right 设置为负值时,什么也没有发生。

我感谢任何想法和想法。谢谢!

0 投票
1 回答
15851 浏览

c++ - 在没有窗口的情况下创建 OpenGL 上下文

我试图弄清楚创建用于离屏渲染的无窗口 OpenGL 程序的最简单方法是什么。

目前我使用它,到目前为止它工作正常:(为清楚起见,此处删除了错误检查)

这可以安全使用吗?创建无窗口 OpenGL 程序的“标准”方法是什么?

编辑:我正在使用 FBO 进行屏幕外渲染。

0 投票
1 回答
6875 浏览

opengl-es-2.0 - 用于 FBO 渲染的 OpenGL ES2.0 屏幕外上下文

我想使用 FBO 进行屏幕外渲染(在没有任何 WS 的控制台环境中)。我知道有必要创建一个 OpenGL 上下文,并且至少为任何操作创建一个虚拟窗口,因此我进行了以下初始化:

这种类型的初始化适用于目标系统,但如果我在 FBO 中画了一些东西,并且在读回它(getReadPixels)后总是只能得到一个黑色图像。我在 X11 上尝试了相同的代码,它(已经)在 eglCreateWindowSurface 调用上失败并出现错误:EGL_BAD_NATIVE_WINDOW WORKS,但是如果我将一个真正的 X11window 本机窗口处理程序传递给这个调用,它就可以工作(这种情况下我可以读回有效的渲染图像还)

请澄清我应该使用哪种类型的表面进行 FBO 渲染?或者我做错了什么?

其余绘制代码: //init 并启动 opengl es shanders Shaders_Init();

提前致谢!!!!!问候, 盖萨

0 投票
0 回答
356 浏览

ios - 使用 Quartz2D 在屏幕外绘制并将结果用作 iOS 中的 OpenGL ES 纹理

根据我读过的文档,使用 CGLayer 进行屏幕外绘图是进行 Quartz 2D 绘图的最高性能方式,因为它允许绘图由 GPU 和 VRAM 存储/管理。

当我完成绘图时,我想从 CGLayer 中获取像素缓冲区并将其用作 OpenGL 纹理。

我知道如何使用像素缓冲区创建纹理。

我已经看到了屏幕外渲染到 CGBitmapContext、检索像素、然后使用这些像素创建纹理的示例。

Quartz 2D 编程指南建议绘制到 CGBitmapContext 很慢并且在软件中完成(不涉及 GPU),所以我避免了这条路。

所以,他们说要快速绘图,我需要在 CGLayer 中进行绘图。如何将像素返回到可以发送到 glTexImage2D() 的内存缓冲区中?

非常感谢 !