【问题标题】:OpenGLES: merging two masks (bitmaps)OpenGLES:合并两个蒙版(位图)
【发布时间】:2012-03-29 02:09:49
【问题描述】:

我需要合并两个位图以使用生成的位图作为掩码。有没有办法在 OpenGL-1.0 中做到这一点而不影响之前绘制的系统。

这是我的算法:

1.- 绘制背景(不透明) 2.- 绘制蒙版(这是两个位图的组合) 3.- 绘制位图(需要遮罩)。

附带说明,我正在使用 OpenGLES 1.0,因此着色器无法工作。任何帮助将不胜感激!

这是我的绘图功能:

  public void onDrawFrame(GL10 gl) {

  // clear the screen and depth buffer
  gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

  // drawing
  gl.glLoadIdentity();

  // draw the background
     gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE);
     gl.glTranslatef(0.0f, 0.0f, -3.72f);
     background.draw(gl);
  gl.glPopMatrix();

  gl.glPushMatrix();
     gl.glEnable(GL10.GL_BLEND);
     gl.glDisable(GL10.GL_DEPTH_TEST);

     // mask1 + mask2   
     gl.glLoadIdentity();
     gl.glTranslatef(0.0f, 0.0f, -3.72f);
     gl.glBlendFunc(GL10.GL_DST_COLOR, GL10.GL_ZERO);
     mask1.draw(gl);

     gl.glLoadIdentity();
     gl.glTranslatef(0.0f, y, -3.72f);
     gl.glBlendFunc(GL10.GL_DST_COLOR, GL10.GL_ZERO);
     mask2.draw(gl);

     gl.glLoadIdentity();
     gl.glTranslatef(0.0f, 0.0f, -3.72f);
     gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE);
     picture.draw(gl);

     gl.glDisable(GL10.GL_BLEND);
     gl.glEnable(GL10.GL_DEPTH_TEST);
     gl.glFlush();
  gl.glPopMatrix();

     y -= 0.2f;

  }

【问题讨论】:

  • 蒙版是一些屏幕对齐的四边形? mask1mask2 可以用作 picture 的纹理吗?
  • 是的。两者都可以用作纹理。问题是,一个将处于固定位置,另一个将移动和/或旋转。因此,我希望只显示两个掩码的组成(它们之间的某种 AND)。
  • Background 横跨整个屏幕。 picture 呢?这是否也跨越整个屏幕?面具肯定要小一些。
  • 是的,我正在寻找类似的东西。问题是 OpenGLES 似乎没有这个功能 glBlendFuncSeparate (至少在 Android 上没有)。解决一个简单的任务需要很长时间......我可能不得不放弃 OpenGL 作为解决方案:-S

标签: opengl-es masking


【解决方案1】:

你有没有看过类似模板缓冲区的东西?这个答案实际上并没有合并位图,但如果这是您正在寻找的结果,它确实使用它们的组合作为掩码。您可以使用掩码的逻辑 OR 或逻辑 AND(不确定您想要什么)。

我相信伪代码会是这样的:

glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 

draw_background();

glEnable(GL_STENCIL_TEST); //enable stencil buffer
glStencilFunc(GL_ALWAYS, 0 , 0); //always pass stencil test
glStencilOp(GL_KEEP,GL_KEEP,GL_INCR); //increment buffer on fragment draw

draw_mask1();
draw_mask2();

if(OR masks) 
    glStencilFunc(GL_LEQUAL, 1, 0xffffffff); //OR masks: pass fragment if  (1 <= buffer)
else if (AND masks)
    glStencilFunc(GL_LEQUAL, 2, 0xffffffff); //AND masks: pass fragment if (2 <= buffer)

glStencilOp(GL_KEEP,GL_KEEP,GL_KEEP); //don't change buffer 

draw_bitmap_to_be_masked(); 

【讨论】:

    猜你喜欢
    • 2023-02-18
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多