如果片段着色器输出之一是整数,WebGL 2 中是否可以使用抗锯齿?

问题描述 投票:0回答:1

从我自己的尝试和阅读 WebGL/OpenGL 文档来看,如果您还将整数数据写入帧缓冲区对象,则似乎不可能进行抗锯齿。这是正确的吗?

例如:

gl.renderbufferStorageMultisample(gl.RENDERBUFFER, 4, gl.R16I, w,h);

...发出警告

WebGL warning: renderbufferStorage(Multisample)?: 'samples' is out of the valid range.
(Firefox) 或
INVALID_OPERATION: renderbufferStorageMultisample: for integer formats, samples > 0
(Chrome)。

WebGL 规范 说:

internalFormat == DEPTH_STENCIL && samples > 0
时生成 INVALID_OPERATION。

OpenGL 规范 (§4.4.2.1) 更进一步指出:

如果internalformat是有符号或无符号整数格式并且samples大于 为零,则生成错误 INVALID_OPERATION。

稍后在同一部分中说:

(调用

glRenderbufferStorage()
相当于调用 RenderbufferStorageMultisample,样本等于 零。

由于所有 FBO 附件的样本计数必须相同,我认为这意味着在同一个绘制调用中不可能有抗锯齿颜色输出 整数输出,所以如果我想要两者,我必须执行两次绘制调用。

这是正确的吗?

我知道抗锯齿整数数据没有多大意义,但我本以为渲染缓冲区分辨率会有一些相当于

gl.NEAREST
的东西。

webgl antialiasing
1个回答
0
投票

不,这是不可能的。您已经引用了规范的相关部分。从技术上讲,您无法正确插值整数,并且在渲染时它通常是 id 或索引,其中插值根本没有意义,并且无法以有意义的方式插值模板缓冲区中的位。如果插值有意义,则应始终使用浮点数,并且在不需要时不要使用模板缓冲区。

© www.soinside.com 2019 - 2024. All rights reserved.