OpenGLES: объединение двух масок (растровых изображений)

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

  }

person ilbesculpi    schedule 23.03.2012    source источник
comment
Маски - это какие-то квадраты, выровненные по экрану? Можно ли использовать mask1 и mask2 в качестве текстур для picture?   -  person Stefan Hanke    schedule 26.03.2012
comment
да. Оба могут быть использованы в качестве текстур. Дело в том, что один будет находиться в фиксированном положении, а другой будет двигаться и/или вращаться. В результате я хочу отображать только состав обеих масок (какое-то И между ними).   -  person ilbesculpi    schedule 26.03.2012
comment
Background занимает весь экран. А как насчет picture? Это тоже охватывает весь экран? Маски, конечно, несколько меньше.   -  person Stefan Hanke    schedule 27.03.2012
comment
вы взглянули на это: stackoverflow.com/questions /5097145/   -  person Tark    schedule 28.03.2012
comment
Да, я как раз искал что-то подобное. Дело в том, что в OpenGLES вроде бы нет этой функции glBlendFuncSeparate (по крайней мере, не на Android). И так много времени уходит на решение простой задачи... Возможно, мне придется отказаться от OpenGL как от решения :-S   -  person ilbesculpi    schedule 28.03.2012


Ответы (1)


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

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

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(); 
person Tim    schedule 28.03.2012