- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 OpenGL 和 C++ 编写一个简单的 2D 框架,现在遇到了与透明纹理和混合相关的问题。我已将我的问题简化为以下内容。
我有两个纹理:地砖和鱼骨。后者包含透明像素。我将我的 OpenGL 清晰颜色设置为“透明绿色”并启用深度测试和混合,如下所示:
glClearColor(0, 1, 0, 0)
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
通过两次调用 glDrawElements()
,我画了鱼,然后画了地板。鱼的 Z 值较高,因此应放置在地砖的前面。 This is the result .
显然,我不希望鱼周围出现这样的绿色框。我认为发生的事情是鱼像素在绘制时与帧缓冲区的颜色渲染缓冲区中的任何内容混合,并且恰好是纯绿色(由于 glClearColor
和 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
)。对于鱼纹理中的每个透明像素,我希望这种混合能够解析为透明(因为我设置了透明的清晰颜色),但正如您所看到的那样,实际情况并非如此。
如果我先画地板,然后画鱼,就可以了 as expected .
我的片段着色器非常简单:
varying lowp vec2 TexCoordOut;
uniform sampler2D Texture;
void main(void) {
gl_FragColor = texture2D(Texture, TexCoordOut);
}
我真的必须手动管理绘图顺序(按 Z 坐标排序)还是有办法解决这个问题? OpenGL 深度缓冲系统不是为解决这个问题而设计的吗?
我正在通过 Xcode 在 iOS 模拟器上测试我的程序。
最佳答案
我确实相信深度排序是必要的——因为即使混合产生的像素是透明的,深度缓冲区也会被写入。因此,任何要绘制在这些透明像素后面(更高深度)的东西都会被简单地丢弃。不幸的是,深度缓冲区没有考虑透明度。
如果您的纹理中没有任何半透明像素,您可以使用 alpha 测试,如果它是透明的,它会丢弃像素,因此它不会写入深度缓冲区。这显然不适用于半透明像素,因为它们要么变得完全不透明,要么根据您的实现/设置被丢弃。您可以通过将着色器更改为以下方式轻松实现它:
varying lowp vec2 TexCoordOut;
uniform sampler2D Texture;
void main(void) {
vec4 tc = texture2D(Texture, TexCoordOut);
if (tc.a < 0.5) //for example, change to any value suitable
discard;
gl_FragColor = tc;
}
除此之外,除了排序之外,我没有其他方法可以通过深度缓冲修复透明度。
您可以在此处阅读有关透明度排序和 alpha 测试的更多详细信息:http://www.opengl.org/wiki/Transparency_Sorting
关于ios - OpenGL 背景清晰颜色渗入透明纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17390071/
你好,我是 Cone。 首先,我们思考一个问题。 为什么会有操作系统? 在我们教科书上会提到分时系统、批处理系统等等现代操作系统前的中间产物,也会讲到管理硬件的功能,但似乎没有讲到为什么有
假设我只想清除顶部的所有条目,清除 Map 的 Map 的最合适方法是什么 -关卡 map ? Map> nestedMap; 方法A:仅清除顶层 map 。 nestedMap.clear();
我时不时遇到一个问题,我不确定解决方案是什么。 我有一个 2 列布局(左边是 strit,然后是主要区域)。在主要区域,我有时会有一个次要的 2 栏布局(例如 - 对于新闻部分,那里有一个图标,然后是
我有以下代码: Created Created .clearfix:after{ clear: both; bdy: "."; display
有没有办法CLS单行输出?我不相信 CLS 有任何开关,所以也许更好的问题是: 有什么办法吗 保留所有以前的输出以供重复使用? 或 捕获当前显示的输出(就像通过标记和复制一样)? 我只是想通过实时反馈
我有一个流式布局。当布局足够宽时,一些 div(.one 和 .two)可以全部水平排列在一条线上。 当布局最终被挤压时,右侧 float 的 div (.two) 最终会出现在多行上。有没有一种方法
我面临着一个我真的不知道从哪里开始解决的问题,所以我希望这个问题不要太宽泛。 我正在制作并在屏幕上应用它,我将有一个包含一些信息的矩形(假设它是一个 )并且我需要用另一个矩形覆盖那个矩形,所以当用户
我的 UITableView 跨越 iPhone View 的大小,并有一个 tableHeaderView 保存附加内容。想要标题清晰,表格的其余部分白色,我将表格的背景颜色设置为清晰,并在 Vie
我一直在使用 ImageMagick,但它产生的结果非常模糊。 convert -density 300 ../images/favicons/procensus.svg -background tr
我有手动数据的工作项目,但我想在我的项目中添加 json 解析。我认为我需要帮助。 (必须是实时解析,如果可能的话,新的item添加时会自动释放) 我的 TableView 代码 - (void)sc
我正在制作一个响应式网站。我有 3 个 div (.block),我需要将它们水平放置在一起。 当屏幕足够宽时,这很容易实现。但是,当我使浏览器更窄时,第三个 div (3) 换行到下一行,但我想要的
如何在 Swift 3 中使这个 UITableView 和它的单元格清晰。 我已经完成了前面的线程,但我仍然得到一个白色背景。 正如您从我的代码中看到的,我已经尝试了提到的各种方法: overrid
当我使用 为了显示图标,它在谷歌浏览器中看起来非常清晰锐利。然而,当我在 Firefox 或 Internet Explorer 中打开 svg 时,图标看起来很模糊。 这些浏览器似乎将图标呈现为半像
我是一名优秀的程序员,十分优秀!