- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我使用 GL_HALF_FLOAT_OES 纹理时;片段着色器似乎可以很好地写入它,当我在 xCode 中使用 gpuTrace 时,我可以观察到它具有正确的值。但是当我使用
读回它时glReadPixels( 0, 0, self.imageSize->v[0], self.imageSize->v[1], GL_RGBA, type, pixels );
像素分量要么 float -0 要么 float 1。这是因为 float 值被意外剪切了吗?有没有办法读回最初写入的浮点值?如果我使用 GL_RGBA16F_EXT
或 GL_RGBA32F_EXT
而不是 GL_RGBA
我会得到无效的枚举。
基于 Rabbid76 的反馈
int formatExt, typeExt;
glGetIntegerv( GL_IMPLEMENTATION_COLOR_READ_FORMAT, &formatExt );
glGetIntegerv( GL_IMPLEMENTATION_COLOR_READ_TYPE, &typeExt );
[ self traceLog:[ NSString stringWithFormat:@"Implementation format is %@, type is %@", [ TextureImage strForFormat:formatExt ], [ TextureImage strForType:typeExt ] ] ];
返回值是“实现格式为 GL_RGBA,类型为 GL_HALF_FLOAT_OES”。这可能意味着 HALF_FLOAT 是它能够读回的唯一值。我仍在调查它是否有可能读回 GL_FLOAT,因为尽管 glGetIntegerv 返回了什么,glReadPixels 不会用无效枚举标记 GL_FLOAT;它接受并处理它,但 float 似乎不是正确的 float ;所以它似乎在进行一些意想不到的转换。
最佳答案
请参阅 glReadPixels
(OpenGL ES 3.1) 的文档其中说:
void glReadPixels(
GLint x,
GLint y,
GLsizei width,
GLsizei height,
GLenum format,
GLenum type,
GLvoid * data);
format
Specifies the format of the pixel data. The following symbolic values are accepted:GL_RGBA
, andGL_RGBA_INTEGER
. An implementation-chosen format will also be accepted. This can be queried withglGet
andGL_IMPLEMENTATION_COLOR_READ_FORMAT
.
type
Specifies the data type of the pixel data. Must be one ofGL_UNSIGNED_BYTE
,GL_UNSIGNED_INT
,GL_UNSIGNED_INT_2_10_10_10_REV
,GL_INT
, orGL_FLOAT
. An implementation-chosen type will also be accepted. This can be queried withglGet
andGL_IMPLEMENTATION_COLOR_READ_TYPE
.
这意味着您必须读取实现选择的 format
和 type
,以读回最初写入的浮点值:
int format = glGet(GL_IMPLEMENTATION_COLOR_READ_FORMAT);
int type = glGet(GL_IMPLEMENTATION_COLOR_READ_TYPE);
glReadPixels(
0, 0, self.imageSize->v[0], self.imageSize->v[1],
format, type, pixels );
请参阅 glGet
(OpenGL ES 3.1) 的文档:
GL_IMPLEMENTATION_COLOR_READ_FORMAT
params returns one value, the format chosen by the implementation in which pixels may be read from the color buffer of the currently bound framebuffer.
GL_IMPLEMENTATION_COLOR_READ_TYPE
params returns one value, the type chosen by the implementation with which pixels may be read from the color buffer of the currently bound framebuffer.
关于ios - GL_HALF_FLOAT_OES 和 glReadPixels,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46626336/
我有一个具有两个线程的 Android OpenGL-ES 应用程序。将线程 1 称为“显示线程”,它将其当前纹理与来自线程 2 的纹理“混合”,也就是“工作线程”。线程 2 执行屏幕外渲染(渲染到纹
我正在使用 pyopengl 获取深度图。 我可以使用 glReadPixels() 获得标准化的深度图。如何将归一化值恢复为世界坐标中的实际深度? 我试过使用 glDepthRange(),但它总是
比如在片段着色器中 FragColor = vec4(TexCoords, MicrifiedCurrentPixelLevel, 0.5); notes:A'value is 0.5. 我想获得Fr
当我绘制一个点时,glReadPixels 不会立即更新。 glColor3f(1.0f, 0.0f, 0.0f); glBegin(GL_POINTS); glVertex2f(x,
我想使用 JOGL 保存我正在用 openGL 显示的视频。为此,我按如下方式将我的帧写入图片,然后,一旦我保存了所有帧,我将使用 ffmpeg。我知道这不是最好的方法,但我仍然不太清楚如何使用 te
我正在尝试使用 glReadPixels 从像素中获取数据。它工作了一段时间。但现在它停止工作了,我不知道为什么。 我需要制作Flood fill算法。 glBegin(GL_POINTS);
我正在使用代码渲染圆形渐变并通过触摸在渐变上创建十字准线( subview )。我现在想读取触摸位置的像素并让它返回 RGB 值,但它总是给我相同的值.. 编辑:添加了呈现渐变的代码 全新代码: vi
我尝试获取渲染像素的颜色。 gl.glColor3f(1f, 0, 0); //draw gl.glReadPixels(lastX - pw / 2, MyCanvas.this.getHeight
我就开门见山了:) 从上面的 480 x 320 图中,我想我可以像蠕虫游戏一样检测像素级别的碰撞。 我想知道的是如何对不同图层上的像素进行采样。正如您在图中看到的,当蠕虫下落时,我只想使用 glRe
经过一个多小时的寻找答案(尝试 Munshi 的“OpenGL ES 2.0 编程指南”中的内容、搜索 Apple 的文档、搜索 StackOverflow),我仍然对如何让 glReadPixels
当我将我的场景渲染到屏幕上时,场景使用了 _MultiSampling Anti-Aliasing 8x; 没问题。 但我想通过 glReadPixels() 读取像素缓冲区,我有一个带有别名线的别名
我正在尝试读取屏幕上绘制的矩形的颜色,但是当我尝试从坐标读取时,它似乎是从一个偏移量读取的,但这个偏移量并不一致。 (我正在使用 SDL2 库以防有帮助)我发现它正在反转坐标,例如如果 y 为 0,则
我使用 JOGL 来处理 OpenGL,但无法获取像素颜色。方法 glReadPixels() 始终返回一个全零的数组。 这就是我的使用方式: private static GL2 gl; stati
我正在尝试通过使用带有 C++ 代码的 glReadPixels 选择两个点(对角)来读取一个像素矩形。选择 Y 轴值时出现问题。 目前,我设法让 glReadPixels 工作直到缩放。当您放大(放
我遇到了 glReadPixels 无法读取颜色附件的问题。 我正在尝试做的事情: 读取非默认帧缓冲区的第三种颜色附件(下面的代码) glFlush(); glFinish(); //binds my
我有一个可以在显示器上渲染的 3d 场景。但是,除了渲染它以显示之外,我还希望能够将渲染的场景导出为图像(比如每 100 帧一次)(比如 JPG 或 PNG 图像),也许将其保存为文件保存在我的某个地
目前我的视口(viewport)上是: 这是我导出图片的方法。 void exportImage() { int width = 200; int height = 100; GLubyt
下面的代码工作正常 const char *title = "glReadOutput"; Mat out1, out2; out1.create(screenHeight,screenWidth,
我是 OpenGL 和 C++ 的新手,最近一直在尝试从我渲染的窗口中提取深度值。我注意到了一些有趣的事情,但我似乎无法弄清楚为什么会这样。 如果我使用与我的窗口大小匹配的“宽度”和“高度”值调用 g
我正在使用 glReadPixels 在 GLSurfaceView.Renderer 的 drawFrame 方法中定期拍摄快照。我需要定期拍摄此快照,以根据我的应用程序要求继续保存我的数据。 但是
我是一名优秀的程序员,十分优秀!