问题标签 [msaa]

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 回答
651 浏览

opengl - CSAA/MSAA 和镜面光

我在一些变体中实现了对 MSAA 的支持:

它可以使用基于上下文(通过在设置上下文时调用 wglChoosePixelFormatARB 并将相应的参数列表传递给它)或通过启用 MSAA 渲染到 FBO(创建一个带有颜色和深度渲染缓冲区附件的多采样 FBO,以及另一个带有颜色附件的 FBO用于解决),并且抗锯齿似乎在整体上起作用。

然而,当我启用抗锯齿时,我发现了一些似乎与镜面反射照明有关的伪影。这对于基于上下文的 CSAA 来说是最差的,对于基于上下文的 MSAA 来说非常糟糕,但是当我在渲染到我的 FBO 时使用 MSAA 时会好得多。

对于我用于测试的其中一种飞机模型,它非常引人注目,尤其是在发动机气缸和一些“电线”周围(它们实际上不是线,而是细气缸):

结果比较

正如您在图像上看到的,当我关闭镜面反射光时,问题几乎消失了,但我不太确定是什么原因造成的。

上面的图像使用这个着色器代码来计算镜面反射(在所有灯光的循环内):

不同的照明模型之间似乎也存在很大差异:

照明模型

左侧使用上述代码进行镜面高光,而右侧使用此代码(再次在主光循环内,迭代所有灯光)

所以我想知道为什么在使用基于 FBO 的 MSAA 和基于上下文的 MSAA 时会有如此大的差异。还有我做错了什么我的镜面高光首先造成了问题?

编辑:按照下面帖子的要求,我还添加了一个测试,用于通过上下文和 FBO 比较 16xQ CSAA 的结果(对于 FBO,我只是使用 RenderbufferStorageMultisampleCoverageNV 而不是 glRenderbufferStorageMultisample)。同样,FBO 结果似乎更好(但仍不令人信服):

16xQ CSAA Ctx 与 FBO

0 投票
1 回答
105 浏览

opengl - MSAA 黑边锯齿类似于预乘纹理

我正在尝试渲染平滑的 AA 文本。

我使用 tessellator 创建了一个多边形网格,然后使用 MSAA pass 来获得平滑的边缘。

*奇怪的是,MSAA 通道会在边缘产生黑色锯齿(类似于预乘纹理) http://i.imgur.com/cywPSoE.png

奇怪的是,如果我做一个非预乘,结果很好!,见第二个附件:http: //i.imgur.com/W06Id18.jpg

我几乎 100% 肯定它是导致此问题的 MSAA,因为如果我关闭 MSAA,我会得到常规的白色锯齿(步骤)

0 投票
1 回答
762 浏览

libgdx - 使用 LibGDX 绘制渐变线

我对 Android 应用程序开发/LibGDX 非常陌生,但对 Java 非常熟悉。我正在努力在 LibGDX 中创建一条看起来像图像中显示的渐变线。

http://i57.tinypic.com/icigqf.png

(我认为它看起来真的很神奇 tbh oO)
注意:该图像是我正在尝试移植的 Java Applet 的屏幕截图。

到目前为止,我几乎没有发现关于如何使用渐变绘制的信息。

如果无法绘制,是否有机会在 Photoshop 中创建渐变并将其放在覆盖它的黑色图层后面的图层中,然后只是“移除”黑色图层以获得线条的坐标?

渐变不可见

.........渐变
---------黑色
^^ 线去除黑色

结果 ->

.........渐变色
--- ----黑色

渐变对于线的坐标是可见的(?)

编辑:我希望线条也被抗锯齿。有什么想法吗?

0 投票
1 回答
1793 浏览

java - 为什么 glDrawBuffer 会生成 GL_INVALID_OPERATION?

我有一个通过 JOGL 使用 OpenGL 3 的 Java 应用程序,并且正在尝试实现多重采样。我正在关注教程,到目前为止,它似乎工作,除了一行。当我打电话时gl.glBackBuffer(GL3.GL_BACK),它会产生GL_INVALID_OPERATION错误。如果程序继续,它似乎只绘制到一个缓冲区,无论它当前是前缓冲区还是后缓冲区,并且每当重画时都会在所需的输出和垃圾数据之间切换。

根据文档:

如果默认帧缓冲区受到影响并且 buf 指示的缓冲区都不存在,则生成 GL_INVALID_OPERATION。

如果帧缓冲区对象受到影响并且 buf 不等于 GL_NONE 或 GL_COLOR_ATTACHMENT$m$,则生成 GL_INVALID_OPERATION,其中 $m$ 是介于 0 和 GL_MAX_COLOR_ATTACHMENTS 之间的值。

我不认为其中任何一个是我的问题,但其中一个必须是,因为它们是生成该错误的唯一场景。

以下是相关代码:

另外,我知道我没有做太多的清理工作,但这不应该影响这个问题。

编辑:根据要求,这是创建 GLCanvas 的代码:

0 投票
1 回答
1516 浏览

c++ - OpenGL 多渲染目标和多重采样

在 OpenGL 中使用多个渲染目标时,我在使用显式多重采样时遇到问题。

我有 4 个渲染目标(位置、漫反射 + 不透明度、法线、镜面反射 + 指数),它们在初始几何传递期间被渲染。

这些都是附加到帧缓冲区对象的非多重采样纹理,然后使用 glDrawBuffers() 设置为渲染目标。这很好用,然后我可以稍后对这些纹理进行采样以获得照明计算所需的信息。迷人的。

没有多重采样纹理。 捷运工作正常。

我现在想尝试消除一些我得到的锯齿,所以我开始使用多重采样纹理来实现显式 MSAA。然而,当我使用多重采样纹理作为渲染目标时,似乎只有第一个渲染目标被绘制到,其余的保持空白。

具有多重采样纹理。 仅渲染到第一个绘制缓冲区。

除了更改纹理的设置、绑定和在着色器中读取的方式之外,我没有更改任何其他代码。

使用以下代码将多重采样纹理附加到帧缓冲区对象:

还附加了多重采样深度/模板纹理。

然后绑定帧缓冲区并设置绘制缓冲区

然后我像往常一样绘制几何图形。但是,当使用 apitrace 检查时,很明显只有第一个颜色附件被绘制。当我使用常规(非多重采样纹理)时,情况并非如此。

然而,所有 4 个绘图缓冲区仍然在设置中。

4 个绘制缓冲区集。

0 投票
1 回答
1169 浏览

opengl - Can linear filtering be used for an FBO blit of an MSAA texture to non-MSAA texture?

I have two 2D textures. The first, an MSAA texture, uses a target of GL_TEXTURE_2D_MULTISAMPLE. The second, non MSAA texture, uses a target of GL_TEXTURE_2D.

According to OpenGL's spec on ARB_texture_multisample, only GL_NEAREST is a valid filtering option when the MSAA texture is being drawn to.

In this case, both of these textures are attached to GL_COLOR_ATTACHMENT0 via their individual Framebuffer objects. Their resolutions are also the same size (to my knowledge this is necessary when blitting an MSAA to non-MSAA).

So, given the current constraints, if I blit the MSAA holding FBO to the non-MSAA holding FBO, do I still need to use GL_NEAREST as the filtering option, or is GL_LINEAR valid, since both textures have already been rendered to?

0 投票
1 回答
848 浏览

c++ - CheckMultisampleQualityLevels(...) 说该卡不支持 MSAA(例如我的 GeForce GTX 780 不支持)?

我用来CheckMultisampleQualityLevels(...)在我的硬件上建立 MSAA 支持。我按这个顺序做:

  1. D3D11CreateDevice(...)给我device
  2. device->CheckMultisampleQualityLevels(...)
  3. 将结果传递给DXGI_SWAP_CHAIN_DESC.SampleDesc
  4. CreateSwapChain(...)给定DXGI_SWAP_CHAIN_DESC

问题是,总是CheckMultisampleQualityLevels(...) 给我0pNumQualityLevels而且我确信我的显卡支持某些 MSAA(我已经在 GeForce gtx 780 和其他设备上测试了该程序,结果相同)。

我错过了什么?我应该先 打电话给别的东西CheckMultisampleQualityLevels(...)吗?

编码:

创建设备:

检查多样本质量水平(基于vertexwahn.de 文章):

交换链:

我的ERROR_HANDLE(...)宏永远不会触发(第一个参数在所有情况下都是 true)。日志说我D3D_DRIVER_TYPE_HARDWARE用于驱动程序类型。

DirectX 调试器说(这是一些问题,但我认为这不是CheckMultisampleQualityLevels(...)给我错误结果的原因):

DXGI 警告:IDXGISwapChain::Present:由于应用程序未正确使用 IDXGISwapChain::ResizeBuffers、指定 IDXGIOutput::GetDisplayModeList 中不可用的 DXGI_MODE_DESC 或未使用 DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH.DXGI_SWAP_CHAIN_DESC::Buffer {Desc = { 1600, 900, 导致全屏演示效率低下60, 1 }, R8G8B8A8_UNORM, 0, 0 }; DXGI_SWAP_CHAIN_DESC::SampleDesc = { 8, 0 }; DXGI_SWAP_CHAIN_DESC::标志 = 0x2; [杂项警告#98:]

0 投票
2 回答
315 浏览

c++ - MSAA UI 自动化 get_accChildCount 错误地为 Winforms 中的 Infragistics UltraTree 返回 0

在 C# Winforms 应用程序中自动化 Infragistics UltraTree 控件时,我发现 UltraTree 实现了 AccessibleObject 模型 (MSAA)。通过将从 spy++ 抓取的 hwnd 放入

问题是当我现在打电话时

我回来的结果是零。通过查看 UltraTree 源代码,我注意到它的子计数实现不应返回零(通过使用 windbg 检查内部代码中使用的字段进行验证)。所有其他 MSAA 功能似乎都可以正常工作(例如“accLocation”)。

我很困惑为什么会这样。我也尝试过使用“IEnumVARIANT”,但是即使树在“get_accChildCount”使用的集合中有 25 个项目,同样也没有发现任何子项。由于机器没有声卡,我还没有尝试查看 Microsoft Narrator 是否能够识别孩子,但希望尽快进行设置尝试。我的猜测是讲述人会找到孩子们,我错过了一些奇怪的把戏。

0 投票
0 回答
454 浏览

opengl - openGL - MSAA 16x 和纹理过滤

当启用 MSAA 16x 时,我在渲染带纹理的全屏四边形时遇到问题。

场景是:

  • 使用 MSAA 16x (A) 创建 FBO
  • 创建没有 MSAA 的 FBO 以解决抗锯齿的 FBO (B)
  • 将 FBO-A 与 MSAA 绑定
  • 渲染全屏纹理四边形:
    • 缩小过滤 GL_LINEAR
    • 与 FBO (A & B) 大小相同
    • 1:1 像素/纹素映射
  • 使用 glBlitFramebuffer(0,0,w,h,0,0,w,h,color, GL_NEAREST) 将 FBO-A 解析为 FBO-B

FBO-B(没有 msaa)中的结果是模糊的。映射是按 1:1 像素/纹素完成的,因此过滤应该不会影响。

一些测试:

  • 如果 MSAA 配置为 8 倍,则结果清晰,不存在模糊图像。我认为这是正确的,而 MSAA 16x 不会发生什么。
  • 如果将过滤配置为 GL_NEAREST 结果是正确的。
  • 使用 nvidia 480、580、680、780 和 980 进行测试

问题:

  • 如果过滤是 GL_LINEAR,结果(模糊)是否正确?
  • 可能是驱动程序失败?某种优化?
0 投票
1 回答
173 浏览

c++ - 启用 MSAA 时,出现伪影并且边缘上的纹理查找失败

在我的立方体的边缘,RGBA 0、0、0、0 的线条显示为该位置的纹理查找失败。我已在片段着色器中为洋红色失败的纹理查找着色。

我是否应该先渲染到纹理,将其绑定到四边形,然后再执行 MSAA 而不是每个立方体?

也许它会采样尚未填充的像素。

在此处输入图像描述