Opengl es OpenGLES:合并两个遮罩(位图)

Opengl es OpenGLES:合并两个遮罩(位图),opengl-es,masking,Opengl Es,Masking,我需要合并两个位图以将生成的位图用作掩码。在OpenGL-1.0中有没有一种方法可以做到这一点而不影响先前绘制的系统 这是我的算法: 1.绘制背景(不透明) 2.-绘制遮罩(这是两个位图的组合) 3.-绘制位图(需要屏蔽) 顺便说一句,我正在使用OpenGLES 1.0,因此着色器无法工作。任何帮助都将不胜感激 这是我的绘图功能: public void onDrawFrame(GL10 gl) { // clear the screen and depth buffer gl.g

我需要合并两个位图以将生成的位图用作掩码。在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;

  }

你看过类似模具缓冲区的东西吗?这个答案实际上并没有合并位图,但它确实使用它们的组合作为掩码(如果这是您要查找的结果)。您可以使用掩码的逻辑AND或逻辑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(); 
glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
绘制背景();
glEnable(GL_模板试验)//启用模具缓冲区
glStencilFunc(GL_始终,0,0)//始终通过模板测试
glStencilOp(GL_KEEP,GL_KEEP,GL_INCR)//片段绘制时的增量缓冲区
画图1();
绘制图2();
如果(或面具)

glStencilFunc(GL_LEQUAL,1,0xffffffff)//或掩码:如果(1您是否查看过类似于模具缓冲区的内容,请传递片段?此答案实际上不会合并位图,但如果您正在查找的结果是这样的,它会将它们的组合用作掩码。您可以使用掩码的逻辑或逻辑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(); 
glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
绘制背景();
glEnable(GL_模具_测试);//启用模具缓冲区
glStencilFunc(GL_ALWAYS,0,0);//始终通过模具测试
glStencilOp(GL_KEEP,GL_KEEP,GL_INCR);//片段绘制时的增量缓冲区
画图1();
绘制图2();
如果(或面具)

glStencilFunc(GL_LEQUAL,1,0xffffff);//或掩码:如果(1)遮罩是一些屏幕对齐的四边形?可以将
mask1
mask2
用作
picture
的纹理吗?可以。两者都可以用作纹理。问题是,一个位于固定位置,另一个将移动和/或旋转。因此,我希望仅显示两个遮罩的组成(某种程度上和他们之间)
Background
覆盖了整个屏幕。那么
picture
呢?这也覆盖了整个屏幕吗?遮罩肯定更小。你看了吗:是的,我正在寻找类似的东西。问题是OpenGLES似乎没有glBlendFuncSeparate这个功能(至少在Android上没有)解决一个简单的任务需要很长时间…我可能不得不放弃OpenGL作为解决方案:-这些掩码是一些屏幕对齐的四边形?可以将
mask1
mask2
用作
picture
的纹理吗?是的。两者都可以用作纹理。问题是,一个位于固定位置,另一个将移动g和/或旋转。因此,我只希望显示两个遮罩的组成(某种类型和它们之间)
Background
覆盖了整个屏幕。那么
picture
呢?这也覆盖了整个屏幕吗?遮罩肯定更小。你看了吗:是的,我正在寻找类似的东西。问题是OpenGLES似乎没有glBlendFuncSeparate这个功能(至少在Android上没有).而且解决一个简单的任务需要很长时间…我可能不得不放弃OpenGL作为解决方案:-S