【问题标题】:OpenGL ES2.0 Load 8-bit image into Stencil BufferOpenGL ES2.0 将 8 位图像加载到模板缓冲区
【发布时间】:2014-07-19 12:46:55
【问题描述】:

我正在学习 OpenGL ES2.0。我的项目中需要一个模板缓冲区。

What I am going to do:
1) Create a stencil buffer.
2) Load a 8-bit gray color image into this stencil buffer (which is also 8-bit per pixel).
3) The gray color image has different area (by setting different part a different value),       so I can render for each area by changing the stencil test value.

找了很久,还是不知道怎么把图片加载到stencil buffer中。

所以对于上图,我将蓝色区域的模板值设置为 1,将绿色区域设置为 2。如何实现?

【问题讨论】:

    标签: opengl-es


    【解决方案1】:

    如果您的位图是 1 位,只需编写一个着色器,该着色器要么 discards 要么允许像素根据 alpha 测试继续进行,或者在固定管道下使用 glAlphaFunc 做同样的事情,并绘制一个合适的四边形和合适的glStencilFunc

    如果它是 8 位的,并且您真的希望所有 8 位都转移到模板上,我能想到的最好的跨平台解决方案都涉及 8 次绘制——从 0 开始,使用 glStencilMask 隔离各个位,设置 @987654326 @ 反转,在着色器的相关位中测试非零值 - 或仅使用常规纹理并直接在着色器中实现等效的模板测试。

    【讨论】:

    • 感谢您的回答,但您能否详细解释一下:“或者只是使用常规纹理并直接在着色器中实现等效的模板测试”?我将使用 8 位模板,
    • 您将在着色器中对纹理进行采样并决定是否使用 discard (或者在 ES 中,如果您的混合模式看起来像丢弃,则可能使用 alpha 0 输出,因为这样可以提供更好的性能PowerVR) 基于其价值。您将自己实施模板测试,而不是使用固定的测试。会花费你一个采样器。如果您要放入模板中的图案应该无限期地保留在那里,那么进行逐位插入会更聪明。你能评论一下为什么你想要一个 8 位模板吗?您打算在 1 位内实现什么?
    • 嗨,我要做的是照片拼贴。请参考我的第二张图片,我的屏幕上可能有多个区域,这就是为什么我需要 8 位模板而不是 1。这张图片只是一个演示,实际上,它是一个 8 位灰度图像,带有 0、1、2 , 每个区域 4 个值。所以我想要做的就是将这个 8 位图像加载到模板缓冲区中!谢谢!
    • 好的,所以您的模板实际上没有真正柔软的边缘?你不希望它做一些像乘法到 alpha 通道的事情吗?
    • 嗨,我发现我对 Stencil 的理解是错误的,我读到这个:code.google.com/p/opengles-book-samples/source/browse/trunk/…。所以我要做的是在空中创建一个位图,该位图包含几个区域(值为 1、2、3 ...的区域)。然后我为每个区域绘制(丢弃那些外部当前区域),通过这个我可以为模板缓冲区设置正确的模板值。对此有何评论?非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多