【问题标题】:Comparing textures in OpenGL ES 2.0在 OpenGL ES 2.0 中比较纹理
【发布时间】:2013-07-05 05:09:56
【问题描述】:

我正在开发一个使用 LibGDX 框架的绘画应用程序,尽管这应该主要与 OpenGL 相关。

基本上,我正在寻找一种方法来防止我用来绘制的精灵在它们不完全不透明时相互重叠,因为这会产生很多令人不快的效果。以 1.0 alpha 将精灵绘制到纹理上,然后以所需的 alpha 将该纹理绘制回我想要的效果,但该方法将涉及在用户绘制时不断重新创建纹理,这太密集而无法实现。

据我所见,对我来说最好的选择,基本而言,是在片段着色器中从另一个中减去这些精灵中的一个。我很确定这条路线会奏效,但我无法弄清楚如何才能在片段着色器中实际比较它们。两者都将始终使用相同的单一纹理,但它们将位于不同的位置。是否有可能像那样实际比较它们,还是有合适的替代方案?

【问题讨论】:

    标签: compare opengl-es-2.0 textures alpha


    【解决方案1】:

    实际上不可能以这种方式比较应用于片段或顶点着色器中不同几何体(精灵)的 2 个纹理,因为它们将在不同时间点的着色器的不同迭代中渲染。

    您可以有两个或更多纹理单元来采样和减去多个纹理,但它们必须应用于相同的顶点(精灵),我认为这不是您想要的。

    更好的方法是在渲染精灵之前计算精灵的接近度。然后,您可以更改它们的位置,或者将接近度作为统一值传递给着色器,然后可以使用它来更改精灵片段像素的 alpha。

    【讨论】:

    • 正如@claymontgomery 所说,这是不可能的。但是,有一些专有的 GL 扩展可以读取片段的颜色。这可以用于自定义混合。例如,nVidia 的 Tegra GPU 具有GL_NV_shader_framebuffer_fetch 扩展,允许您在 GLSL 中读取片段颜色。更多信息:developer.nvidia.com/sites/default/files/akamai/mobile/files/… 此外,在 iOS 6 中,PowerVR GPU 也允许读取着色器中的最后一个片段数据(google for GL_APPLE_shader_framebuffer_fetch),所以理论上这在 Android 中也可以使用适当的驱动程序。
    • 谢谢 Clay,我有点想走我尝试的路线是不可能的,只是想验证一下。我也不太清楚你所说的“接近”是什么意思。你只是指位置坐标还是沿着这些线的东西?我也试图找出与此类似的东西,但对于如何用它们实际创建对我的目的有用的东西,我有点迷茫。 @Keukraine 我一定会研究一下。由于我想支持大量不同的设备,这似乎是一条艰难的道路,但我会看看进展如何!
    • 接近度是指相邻精灵之间的明显距离。如果您的相机具有固定位置并且您使用正交投影而不是透视投影,那么这很容易从您的精灵位置(距离公式)计算出来。
    • 啊,虽然我的相机是可移动的,但我确实使用正交投影。我到底应该看看这条路线对我来说是否可行?如果我知道大致的发展方向,我应该能够解决它,但我无法完全弄清楚我是如何通过两个精灵之间的距离来完成这项工作的。
    • 如果相机移动,那么计算精灵之间的视距将更加复杂,因为它取决于相机位置,除非移动小到可以忽略。
    猜你喜欢
    • 2011-05-19
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 2012-03-29
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多