gpt4 book ai didi

android - 使用模板测试剪辑在 OpenGL-ES 中绘制的项目

转载 作者:太空狗 更新时间:2023-10-29 14:05:12 25 4
gpt4 key购买 nike

我目前正在 Android 中从事 OpenGL 项目。现在,我正在尝试使用模板缓冲区为绘图时要限制的项目创建一个“剪辑”。我的问题是我希望能够创建一个剪辑形状,然后稍后“删除”该剪辑形状的部分(很像在 Android Canvas 中调用带有 Region.Op.UNION 的 clipPath() 然后另一个 clipPath( ) 调用 Region.Op.DIFFERENCE)

基本上,我的 Intent 是只绘制模板缓冲区位值为 1 的屏幕部分。因此,据我所知,我应该能够使用不同的 glStencilOp 函数绘制模板缓冲区,这将允许我在某些区域用 1 绘制,然后可能稍后在这些区域的某些部分用默认的 0 替换它们。

作为示例测试,我尝试在屏幕上剪辑一个“ donut ”,使用类似这样的东西(注意:我使用 LibGDX 开源项目中的 ShapeRenderer 来绘制形状):

// Beginning LibGDX shapeRenderer.
shapeRenderer.begin(ShapeType.FILLED);

gl20.glClear(GL20.GL_STENCIL_BUFFER_BIT); // Clear stencil buffer.
gl20.glEnable(GL20.GL_STENCIL_TEST); // Enable stencil test.
gl20.glColorMask(false, false, false, false); // Disable color drawing.
gl20.glStencilMask(0xFF); // Set 0xFF as stencil mask.

// Have stencil test always fail, replace drawn stencil bits with 1.
gl20.glStencilFunc(GL20.GL_NEVER, 1, 0xFF);
gl20.glStencilOp(GL20.GL_REPLACE, GL20.GL_KEEP,GL20.GL_KEEP);

/* Draw outer circle, libGDX call. 600px radius. */
shapeRenderer.circle(screenRect.width() / 2, screenRect.height() / 2, 600);

// Now, replace newly drawn stencil bits with 0.
gl20.glStencilOp(GL20.GL_ZERO, GL20.GL_KEEP, GL20.GL_KEEP);

/* Draw inner circle, libGDX call. 200px radius. */
shapeRenderer.circle(screenRect.width() / 2, screenRect.height() / 2, 200);

// Re-enable color drawing.
gl20.glColorMask(true, true, true, true);
// Now, items drawn will be confined to areas with '1' stencil bit.
gl20.glStencilFunc(GL20.GL_EQUAL, 1, 0xFF);
gl20.glStencilOp(GL20.GL_KEEP, GL20.GL_KEEP, GL20.GL_KEEP);
gl20.glStencilMask(0x00);

/* Draw a filled, colored rectangle to the entire screen. */
shapeRenderer.setColor(Color.RED);
shapeRenderer.drawRect(screenRect);

shapeRenderer.end();

现在,据我了解,这应该会在屏幕上绘制一个彩色的“ donut ”;然而,正如上面所写的代码,屏幕上没有绘制任何内容。

但是,如果我只剪掉外圈(而不是尝试通过“gl20.glStencilOp(GL20.GL_ZERO, GL20.GL_KEEP, GL20.GL_KEEP)”调用和随后的内圈绘制来摆脱内圈,在屏幕上绘制一个与预期外圈大小相同的圆圈。

我查看了我能找到的文档,到目前为止我读过的所有内容都表明这应该有效。我在这里缺少什么吗?非常感谢任何帮助。

最佳答案

我发现了问题;我在 ShapeRenderer 中的一个 begin() 和 end() 调用之间绘制了两个圆圈。因此,在调用 end() 时,两个圆都被绘制了。这意味着形状甚至没有绘制到模板缓冲区,因为我在 end() 调用之前调用了这些函数:

// Now, items drawn will be confined to areas with '1' stencil bit.
gl20.glStencilFunc(GL20.GL_EQUAL, 1, 0xFF);
gl20.glStencilOp(GL20.GL_KEEP, GL20.GL_KEEP, GL20.GL_KEEP);
gl20.glStencilMask(0x00);

如果我确保在绘制每个形状之前使用 begin() 调用并在绘制每个形状之后使用 end() 调用,它将在预期时间绘制,因此确保它正在将预期值绘制到模板缓冲区。

关于android - 使用模板测试剪辑在 OpenGL-ES 中绘制的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32929760/

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