gpt4 book ai didi

c++ - 在固定管道中使用 OpenGL 绘制时 mask 部分纹理

转载 作者:行者123 更新时间:2023-11-30 04:25:52 25 4
gpt4 key购买 nike

我正在尝试找出在绘制纹理部分时遮盖纹理部分的最佳方法。我的问题在于我似乎运行了我们的 alpha 蒙版!

我们正在使用 openGL 绘制定制的 2D 游戏引擎。该游戏由 Sprite 和简单的 block 纹理构建而成。

我想要的结果是这样的:

  • 一个角色 Sprite 被绘制到位(使用它的 alpha 颜色而不仅仅是一个盒子)
  • 一个项目被绘制到玩家手中(也使用它的 alpha 颜色绘制到场景中而不是一个盒子)
  • 元素应该出现在角色 ARM /手的后面,但在 body 其他部分的上方。

目前我能弄清楚如何完成此操作的唯一方法是按顺序绘制它们( body 、元素、 ARM ),但我想避免这种情况以使艺术 Assets 更容易处理。我的想法解决方案是绘制角色,然后使用 alpha 蒙版绘制项目,该蒙版遮挡应该在 ARM “下方”的纹理区域。

我见过的其他解决方案如 this ,其中使用了 glBlendFuncSeparate() 函数。我试图避免引入扩展,因为我当前的 OpenGL 版本不支持它。并不是说我反对这个想法,但是仅仅为了画一个 alpha 蒙版就把它强加进来似乎有点不好意思?

我完全承认这对我来说是一个学习过程,我以此为借口来真正了解 OpenGL 的处理方式。关于我应该去哪里正确绘制它的任何建议? OpenGL 在固定管道中有没有办法获取纹理,在其上应用 alpha 蒙版,然后将其绘制到缓冲区中?我应该让步并将我的角色分成模型的几个部分吗?

[更新:2012 年 8 月 12 日]

尝试添加 Tim 建议的代码,但我似乎遇到了问题。当我启用模板缓冲区时,一切都被屏蔽掉了,而不仅仅是我想要的。这是我的测试示例代码。

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

// Disable writing to any of the color fields
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);

glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);

glStencilFunc(GL_ALWAYS, 0,0);

// Draw our blocking poly
glBegin(GL_POLYGON);
glVertex2f( 50, 50 );
glVertex2f( 50, 50+128 );
glVertex2f( 50+128, 50+128 );
glEnd();

glStencilFunc(GL_GREATER, 0, -1);

glEnable(GL_STENCIL_TEST);

// Re enable drawing of colors
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);

// Enable use of textures
glEnable(GL_TEXTURE_2D);

// Bind desired texture for drawing
glBindTexture(GL_TEXTURE_2D,(&texture)[0]);

// Draw the box with colors
glBegin(GL_QUADS);
glTexCoord2d( 0, 0 ); glVertex2f( 50, 50 );
glTexCoord2d( 0, 1 ); glVertex2f( 50, 50+128 );
glTexCoord2d( 1, 1 ); glVertex2f( 50+128, 50+128 );
glTexCoord2d( 1, 0 ); glVertex2f( 50+128, 50 );
glEnd();

// Swap buffers and display!
SDL_GL_SwapBuffers();

明确一点,here也是我的初始化代码,用于设置此系统。

当代码在模板禁用的情况下运行时,我得到这个:Without glEnable(GL_STENCIL_TEST);

当我使用 glEnable(GL_STENCIL_TEST) 时,我得到这个:enter image description here

我试过各种选项,但我看不出我的模板缓冲区阻塞一切的明确原因。

[更新#2 2012 年 8 月 12 日]

我们得到了一些工作代码,谢谢蒂姆!这是我最终运行以正常工作的内容。

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

// Disable writing to any of the color fields
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);

glStencilOp(GL_INCR, GL_INCR, GL_INCR);

glEnable(GL_STENCIL_TEST);
// Draw our blocking poly
glBegin(GL_POLYGON);
glVertex2f( 50, 50 );
glVertex2f( 50, 50+128 );
glVertex2f( 50+128, 50+128 );
glEnd();

glStencilFunc(GL_EQUAL, 1, 1);

glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);

// Re enable drawing of colors
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);

// Enable use of textures
glEnable(GL_TEXTURE_2D);

// Bind desired texture for drawing
glBindTexture(GL_TEXTURE_2D,(&texture)[0]);

// Draw the box with colors
glBegin(GL_QUADS);
glTexCoord2d( 0, 0 ); glVertex2f( 50, 50 );
glTexCoord2d( 0, 1 ); glVertex2f( 50, 50+128 );
glTexCoord2d( 1, 1 ); glVertex2f( 50+128, 50+128 );
glTexCoord2d( 1, 0 ); glVertex2f( 50+128, 50 );
glEnd();
glDisable(GL_STENCIL_TEST);

// Swap buffers and display!
SDL_GL_SwapBuffers();

最佳答案

对于只有一种纹理和一种 alpha 蒙版的情况,这是我的想法:

  1. 像往常一样将角色绘制到场景中。
  2. 锁定 RGB 颜色 channel ,使其无法使用 glColorMask 进行更改
  3. 使用 glStencilOp(GL_KEEP, GL_KEEP, GL_INCR) 设置模板缓冲区; glStencilFunc(GL_ALWAYS, 0,0);
  4. 在启用 alpha 测试的情况下绘制 alpha 蒙版。这将在 alpha 测试通过的任何地方增加模板缓冲区(您可能需要根据掩码极性翻转它)
  5. 此时,帧缓冲区中有一个字符纹理,模板缓冲区中有一个 mask 轮廓。
  6. 使用 glColorMask 重新启用颜色 channel
  7. 使用 glStencilFunc(GL_GREATER, 0, -1); 为武器设置模板缓冲区; 这将只绘制模板缓冲区大于零的武器纹素,并拒绝模板缓冲区中的像素未更新。
  8. 正常绘制武器纹理。

关于c++ - 在固定管道中使用 OpenGL 绘制时 mask 部分纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11896638/

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