问题标签 [multisampling]
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 - SDL 多重采样
我一直在尝试让 SDL FSAA 与 Multisampling 一起工作,但它不想这样做。
我从一些简单的事情开始:
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 2);
但我做了相关的获取,它为缓冲区返回 0,为样本返回 1。(SetVideo 之前和之后)。
我在我的 GeForce 280M 上都试过了,怀疑是移动问题,在我的 580 上试过,也没有运气。
我正在运行带有最新驱动程序的 Windows 7。
如果我在 NVidia 控制面板中强制启用 FSAA,效果会很好,但我似乎无法让应用程序启用它。
有任何想法吗?
opengl - 多重采样 FBO 深度/模板和 OpenGL 规范
OpenGL 4.2 规范(第 3.3.1 节)明确指出:
因为每个样本都包含颜色、深度和模板信息,所以颜色(包括纹理操作)、深度和模板函数的执行与单样本模式等效。 一个额外的缓冲区,称为多采样缓冲区,被添加到帧缓冲区。 像素样本值(包括颜色、深度和模板值)存储在此缓冲区中。样本包含每个片段颜色的单独颜色值。 当帧缓冲区包含多重采样缓冲区时,它不包含深度或模板缓冲区,即使多重采样缓冲区不存储深度或模板值。但是,颜色缓冲区确实与多样本缓冲区共存。
但是,如果我需要深度/模板测试,我必须设置一个 depth_stencil 多采样渲染缓冲区。
这是否违反规格或我错过了什么?
opengl - GLSL 330 中的多重采样和片段着色器
我试图了解在多重采样渲染期间如何调用片段着色器,我仔细阅读了规范但我有点困惑..
我设置了一个带有颜色和深度/模板渲染缓冲区的多重采样 FBO .. 很好
我设置了一个简单的 1 线顶点着色器仅用于变换和另一个 1 线片段着色器,它只返回黑色.. 它很好
我画了一条线 - 这条线显示平滑..很好
现在,如果在片段着色器中,我不是笨拙地返回黑色,而是从多重采样纹理中提取纹理,总是读取样本编号 0(即黑色),我得到一条锯齿线..
a simplemyoutcolor=vec4(0.0)
和 a 和有什么不一样myoutcolor=texelFetch(mysampler2DMS,...,0)
?
规范规定片段着色器仅在静态使用gl_SampleID
,gl_Samplemask[]
或具有“示例”存储限定符时在样本级别执行。(在所有这些情况下,这意味着 GLSL#version 400
或更高版本),否则它将在片段级别执行。 .
但那怎么可能呢?在上面的例子中,即使我总是返回相同的颜色,我也得到了一条平滑线,所以我认为片段着色器总是在多采样帧缓冲区中的样本级别执行。另一方面,如果不是这样,我即使始终从 MS 纹理返回相同的样本,也应该得到平滑的结果。
有人可以帮我解决这个问题吗?
PS:我目前使用#version 330,但我发现每个multisampling-aware statement Id需要正确处理MS(gl_SampleID
,,gl_Samplemask[]
sample..)仅在GLSL 400或更高版本中受支持..所以,究竟是什么支持GLSL 330提供正确处理多重采样?如何在 GLSL 330 中处理 MS 纹理?
opengl - 多重采样如何真正起作用?
我对了解多重采样的工作原理非常感兴趣。我找到了大量关于如何启用或使用它的文献,但很少有关于它为实现抗锯齿渲染而真正做什么的信息。我发现,在很多地方,相互矛盾的信息只会让我更加困惑。
请注意,我知道如何启用和使用多重采样(我实际上已经使用它),我不知道什么样的数据真正进入多重采样渲染缓冲区/纹理,以及如何在渲染管道中使用这些数据。
我可以很好地理解超级采样的工作原理,但是多重采样仍然有一些我想了解的模糊领域。
这是规格所说的:(OpenGL 4.2)
像素样本值(包括颜色、深度和模板值)存储在此缓冲区(多样本缓冲区)中。样本包含每个片段颜色的单独颜色值。
...
在多重采样渲染期间,像素片段的内容以两种方式更改。首先,每个片段都包含一个带有 SAMPLES 位的覆盖率值。
...
其次,每个片段包括 SAMPLES 深度值和相关数据集,而不是在单样本渲染模式中维护的单个深度值和相关数据集。
因此,每个样本都包含不同的颜色、覆盖位和深度。与普通的超级采样有什么区别?对我来说似乎是“加权”超级采样,其中每个最终像素值由其样本的覆盖率值而不是简单的平均值确定,但我对此非常不确定。那么样本级别的纹理坐标呢?
例如,如果我将法线存储在 RGBF 多重采样纹理中,我会在多边形边缘将它们读回“抗锯齿”(即接近 0)吗?
每个片段调用一次片段着色器,除非它使用 gl_SampleID、glSampleIn 或具有“样本”存储限定符。如何为每个片段调用一次片段着色器并获得抗锯齿渲染?
opengl - 为什么在使用 FBO 进行多重采样时,OpenGL 会使我的场景变亮?
我刚刚将我的 OpenGL 绘图代码从绘图直接切换到显示,以使用附加了渲染缓冲区的屏幕外 FBO。当我分配正常的渲染缓冲区存储时,屏幕外 FBO 会正确地传送到屏幕上。
但是,当我在渲染缓冲区上启用多重采样(通过glRenderbufferStorageMultisample
)时,场景中的每种颜色似乎都被变亮了(因此提供了与非多重采样部分不同的颜色)。
我怀疑我需要设置一些glEnable
选项来保持相同的颜色,但我似乎在其他地方找不到任何提到这个问题的地方。
有任何想法吗?
opengl - 各向异性过滤和多重采样
我正在阅读 OpenGL Superbible 第 5 版。我遇到了几个术语,虽然在书中解释了对我来说还不是很清楚。
首先是多重采样。我知道它用于平滑多边形并帮助渲染更好的图像。我不明白它与抗锯齿有何不同。
其次是各向异性过滤。我知道这种纹理过滤的效果,但我想知道它是如何以及何时使用的。可能是算法的一般解释?我用谷歌搜索了它,维基百科并没有解释太多。
opengl - FBO Blitting 不工作
我正在尝试将多采样场景渲染为纹理,这是我正在使用的代码。我得到一个黑屏。我在 init 结束时检查了 fbo 的完整性,他们报告两个 fbo 都是完整的。
你能看出我遗漏了什么吗?我认为问题可能出在glFramebufferRenderbuffer
电话上。我尝试将第一个 arg 切换为GL_READ_FRAMEBUFFER
但它没有修复。
我检查glGetError
并没有错误。如果我设置错误,肯定会失败并给我INVALID_ENUM
或INVALID_OPERATION
帮助我缩小问题范围。
我使用此代码的方式是,为了启用多重采样,我必须更改的是在绘制时绑定 multi_fbo,然后调用将绑定和 blit 的解析函数。之后,我的 fbo 纹理(当我直接渲染到它时效果很好)现在应该包含多重采样渲染。但它只是黑色的。我还调用glEnable(GL_MULTISAMPLE)
了初始化代码的另一部分。
我现在将尝试将非多重采样纹理blit 到另一个纹理以确保它有效。希望这将帮助我缩小我搞砸的地方。
更新:事实证明,将常规 FBO 复制到另一个相同的 FBO(两者都具有附加到颜色附件 0 的纹理)会产生相同的黑屏。blit 根本行不通。
同样奇怪的是,一旦我尝试进行 blit,然后绘制 SOURCE fbo 的纹理,它仍然是全黑的。这就像试图破坏一切一样。
有人知道或有任何 FBO blitting 代码吗?我找不到任何东西,但我知道人们已经得到了多重采样 FBO 的工作。
以下是您可以提供帮助的方法:如果您有glBlitFramebuffer
任何时候调用的代码,我希望看到其他调用来设置该操作。一旦我调用它,我似乎什么也得不到,除了黑色缓冲区和纹理。
更新:Blit to backbuffer 工作,即使是多重采样!这当然不需要任何设置,因为我只是绑定了帧缓冲区 0。所以问题似乎是我设置了 FBO,它有一个应该被 blitted 的纹理附件。
opengl - 如何在多采样纹理上渲染帧缓冲区对象?
我目前有一个使用多个通道的渲染引擎,其中图像的各个部分在纹理上渲染,然后使用着色器组合。它有效,现在我想激活多重采样。
我在这里( http://www.opengl.org/wiki/Framebuffer_Object_Examples#MSAA )读到,使用 OpenGL,您不能将 a 附加GL_TEXTURE2D_MULTISAMPLE
到帧缓冲区对象。
似乎使用多重采样并且仍然可以访问结果作为纹理的一种方法是使用多重采样渲染缓冲区,然后将结果复制到多重采样纹理中。
我的问题是:前进的最佳方式是什么?
- 是否可以在渲染缓冲区中渲染并使用我的着色器中的输出,而不复制到纹理中?
- 我是否应该将缓冲区的内容复制到纹理中,然后使用它?
- 还有其他更好的解决方案吗?
谢谢。
python - 在 wxPython OpenGL 上下文中启用多重采样
我正在尝试在我正在编写的 OpenGL 程序中启用多重采样。该应用程序将需要大量的 GUI,因此我使用的是 wxPython(我不太熟悉)而不是 PyGame (SDL)。
我真的需要对主要的 GLCanvas 进行硬件多重采样。我知道这在 wx 的 C++ 版本中是可能的,例如,如何为 wxWidgets OpenGL 程序启用多重采样?. 但是,我尝试了类似的方法,但它不适用于 wx Python。
那么,我想知道的是,使用 wxPython 是否可以进行多重采样?
我已经想到的想法:
- 在 wx.Frame 中使用 PyGame 上下文。使用 SDL 的硬件多重采样。不知道这是否真的有效。IIRC,调整 SDL OpenGL 上下文的大小会破坏它们的内容,这对这个应用程序来说有点问题。虽然 。. . 我想这可能是可行的。
- 使用更高分辨率的 FBO 进行渲染,然后使用多重采样进行下采样。这个 。. . 工作,有点。但是超级采样比多重采样要慢得多,而且该技术对于 GL_LINE 之类的东西效果不佳。我已经尝试过这个解决方案。
- 使用带有多重采样渲染目标的 FBO。这将涉及大量更改,并且会限制跨系统可移植性。
- 理想情况下:使用 wxPython 的内置支持(如果存在)。
谢谢,
伊恩
ios - 为什么多重采样不起作用?
我试图让多重采样在我的 OpenGL ES 应用程序中工作。
帧缓冲设置代码:
渲染代码:
结果:
如您所见,三角形仍然有锯齿边。