问题标签 [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.
opengl - CSAA/MSAA 和镜面光
我在一些变体中实现了对 MSAA 的支持:
它可以使用基于上下文(通过在设置上下文时调用 wglChoosePixelFormatARB 并将相应的参数列表传递给它)或通过启用 MSAA 渲染到 FBO(创建一个带有颜色和深度渲染缓冲区附件的多采样 FBO,以及另一个带有颜色附件的 FBO用于解决),并且抗锯齿似乎在整体上起作用。
然而,当我启用抗锯齿时,我发现了一些似乎与镜面反射照明有关的伪影。这对于基于上下文的 CSAA 来说是最差的,对于基于上下文的 MSAA 来说非常糟糕,但是当我在渲染到我的 FBO 时使用 MSAA 时会好得多。
对于我用于测试的其中一种飞机模型,它非常引人注目,尤其是在发动机气缸和一些“电线”周围(它们实际上不是线,而是细气缸):
正如您在图像上看到的,当我关闭镜面反射光时,问题几乎消失了,但我不太确定是什么原因造成的。
上面的图像使用这个着色器代码来计算镜面反射(在所有灯光的循环内):
不同的照明模型之间似乎也存在很大差异:
左侧使用上述代码进行镜面高光,而右侧使用此代码(再次在主光循环内,迭代所有灯光)
所以我想知道为什么在使用基于 FBO 的 MSAA 和基于上下文的 MSAA 时会有如此大的差异。还有我做错了什么我的镜面高光首先造成了问题?
编辑:按照下面帖子的要求,我还添加了一个测试,用于通过上下文和 FBO 比较 16xQ CSAA 的结果(对于 FBO,我只是使用 RenderbufferStorageMultisampleCoverageNV 而不是 glRenderbufferStorageMultisample)。同样,FBO 结果似乎更好(但仍不令人信服):
opengl - MSAA 黑边锯齿类似于预乘纹理
我正在尝试渲染平滑的 AA 文本。
我使用 tessellator 创建了一个多边形网格,然后使用 MSAA pass 来获得平滑的边缘。
*奇怪的是,MSAA 通道会在边缘产生黑色锯齿(类似于预乘纹理) http://i.imgur.com/cywPSoE.png
奇怪的是,如果我做一个非预乘,结果很好!,见第二个附件:http: //i.imgur.com/W06Id18.jpg
我几乎 100% 肯定它是导致此问题的 MSAA,因为如果我关闭 MSAA,我会得到常规的白色锯齿(步骤)
libgdx - 使用 LibGDX 绘制渐变线
我对 Android 应用程序开发/LibGDX 非常陌生,但对 Java 非常熟悉。我正在努力在 LibGDX 中创建一条看起来像图像中显示的渐变线。
(我认为它看起来真的很神奇 tbh oO)
注意:该图像是我正在尝试移植的 Java Applet 的屏幕截图。
到目前为止,我几乎没有发现关于如何使用渐变绘制的信息。
如果无法绘制,是否有机会在 Photoshop 中创建渐变并将其放在覆盖它的黑色图层后面的图层中,然后只是“移除”黑色图层以获得线条的坐标?
渐变不可见
.........渐变
---------黑色
^^ 线去除黑色
结果 ->
.........渐变色
--- ----黑色
渐变对于线的坐标是可见的(?)
编辑:我希望线条也被抗锯齿。有什么想法吗?
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 的代码:
c++ - OpenGL 多渲染目标和多重采样
在 OpenGL 中使用多个渲染目标时,我在使用显式多重采样时遇到问题。
我有 4 个渲染目标(位置、漫反射 + 不透明度、法线、镜面反射 + 指数),它们在初始几何传递期间被渲染。
这些都是附加到帧缓冲区对象的非多重采样纹理,然后使用 glDrawBuffers() 设置为渲染目标。这很好用,然后我可以稍后对这些纹理进行采样以获得照明计算所需的信息。迷人的。
我现在想尝试消除一些我得到的锯齿,所以我开始使用多重采样纹理来实现显式 MSAA。然而,当我使用多重采样纹理作为渲染目标时,似乎只有第一个渲染目标被绘制到,其余的保持空白。
除了更改纹理的设置、绑定和在着色器中读取的方式之外,我没有更改任何其他代码。
使用以下代码将多重采样纹理附加到帧缓冲区对象:
还附加了多重采样深度/模板纹理。
然后绑定帧缓冲区并设置绘制缓冲区
然后我像往常一样绘制几何图形。但是,当使用 apitrace 检查时,很明显只有第一个颜色附件被绘制。当我使用常规(非多重采样纹理)时,情况并非如此。
然而,所有 4 个绘图缓冲区仍然在设置中。
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?
c++ - CheckMultisampleQualityLevels(...) 说该卡不支持 MSAA(例如我的 GeForce GTX 780 不支持)?
我用来CheckMultisampleQualityLevels(...)
在我的硬件上建立 MSAA 支持。我按这个顺序做:
D3D11CreateDevice(...)
给我device
device->CheckMultisampleQualityLevels(...)
- 将结果传递给
DXGI_SWAP_CHAIN_DESC.SampleDesc
CreateSwapChain(...)
给定DXGI_SWAP_CHAIN_DESC
问题是,总是CheckMultisampleQualityLevels(...)
给我0
。pNumQualityLevels
而且我确信我的显卡支持某些 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:]
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 是否能够识别孩子,但希望尽快进行设置尝试。我的猜测是讲述人会找到孩子们,我错过了一些奇怪的把戏。
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,结果(模糊)是否正确?
- 可能是驱动程序失败?某种优化?