gpt4 book ai didi

ios - 在 iOS 应用程序的 OpenGL ES 2.0 中使用 mask

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:55:15 30 4
gpt4 key购买 nike

我有一个应用程序,我希望用户在屏幕的某个特定区域进行绘图。为此,我使用了一张蒙版图片,在可绘制区域为黑色,在不可绘制区域为透明。因此用户只能在蒙版内部的屏幕区域和蒙版的黑色区域内绘制。

我尝试通过模板缓冲区实现它并修改了 GLPaint 示例项目中的一些代码:http://pastebin.com/94MBr1Su

但是我仍然不明白模板缓冲区的用法。谁能帮我解决我的问题的模板缓冲区代码示例?另外,有没有办法在没有模板缓冲区的情况下实现这一点?

最佳答案

因为您的蒙版是纹理,所以模板缓冲区不是一个好主意。

  • mask 渲染时,必须使用“discard;”用于片段着色器中的透明像素
  • 欢迎来到抗锯齿问题

为了您的好奇心,这里有一些代码可以使用模板缓冲区配置掩码:

const bool invert_mask = false; // allow to draw inside or outside mask
unsigned mask_id = 1; // you can use this code multiple time without clearing stencil, just increment mask_id

glEnable(GL_STENCIL_TEST);
// write on stencil_mask
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
glStencilFunc(GL_ALWAYS, mask_id, 0);

// remove depth test and color writing
glDepthMask(GL_FALSE);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);


// TODO: draw geometry of mask here. (if you use a texture, dont forget to use discard in the shader


// enabled depth & color writing
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glDepthMask(GL_TRUE);

// no stencil write
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
// test stencil value
glStencilFunc(invert_mask ? GL_NOTEQUAL : GL_EQUAL, mask_id, 0xff);


// TODO: draw "clipped" geometry here


// finally, remove stencil test
glDisable(GL_STENCIL_TEST);

最简单的方法是根本不使用模板。创建一个灰度屏幕大小的纹理,在里面写下你的蒙版。然后将其绑定(bind)到您的片段着色器中:

uniform LOW_P sampler2D u_diffuse_sampler;
uniform LOW_P sampler2D u_mask_sampler;
varying mediump vec2 v_texcoord;

void main(void) {
gl_FragColor = texture2D(u_diffuse_sampler, v_texcoord) * texture2D(u_mask_sampler, v_texcoord).r;
}

关于ios - 在 iOS 应用程序的 OpenGL ES 2.0 中使用 mask ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7777127/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com