OpenGLES: объединение двух масок (растровых изображений) - PullRequest
0 голосов
/ 24 марта 2012

Мне нужно объединить два растровых изображения, чтобы использовать полученное растровое изображение в качестве маски. Есть ли способ сделать это в 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;

  }

1 Ответ

4 голосов
/ 28 марта 2012

Вы смотрели что-то вроде буфера трафарета для этого? Этот ответ на самом деле не объединяет растровые изображения, но он использует их комбинацию в качестве маски, если это результат, который вы ищете. Вы можете использовать либо логическое ИЛИ, либо логическое И масок (не уверен, что вы хотите).

Псевдокод, я думаю, будет выглядеть примерно так:

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(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...