2014-11-09 3 views
2

Я хочу добавить аддитивное смешение на поверхности поверхности предварительного просмотра камеры, привязанной к моему контексту opengl.Аддитивное смешивание без glClear

Я получаю странно визуализированную текстуру, когда я включаю смешение (20 шумовых квадратов, получаемых), если я вызываю GLES20.glClear (GLES20.GL_COLOR_BUFFER_BIT); предварительный просмотр является правильным, но я теряю аддитивное смешение, поскольку я очистил буфер!

С glClear вызова enter image description here

Без glClear вызова enter image description here

Я понятия не имею, Что проблема, я новичок в OpenGL-ES, любые предложения? Если какой-либо фрагмент кода необходим, я могу обеспечить его лучше понять.

установка соответствующий код только. При необходимости запросите любую другую часть кода.

public void onSurfaceCreated(GL10 unused, EGLConfig config) { 

//compile shader, link program.... etc omitted for brevity 

//enable additive blending 
GLES20.glEnable(GLES20.GL_BLEND); 
GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE); 
GLES20.glBlendEquation(GLES30.GL_MAX); 
} 

public void onDrawFrame(GL10 unused) { 
// Do not want to do this, but if i do preview is normal but i lose my blending 
//GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);  
surfaceTexture.updateTexImage(); 
    GLES20.glUseProgram(_onscreenShader); 

    int th = GLES20.glGetUniformLocation(_onscreenShader, "sTexture"); 
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
    GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, _rawVideoTexture); 
    GLES20.glUniform1i(th, 0); 
    GLES20.glVertexAttribPointer(_onscreenPositionAttribute, 2, GLES20.GL_FLOAT, false, 4 * 2, pVertex); 
    GLES20.glVertexAttribPointer(_onscreenUVAttribute, 2, GLES20.GL_FLOAT, false, 4 * 2, pTexCoord); 
    GLES20.glEnableVertexAttribArray(_onscreenPositionAttribute); 
    GLES20.glEnableVertexAttribArray(_onscreenUVAttribute); 
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); 
} 
+0

Интересно, что ни один разработчик Android не попробовал! –

+0

Может быть, если вы покажете нам еще код ... –

+0

@ Jaa-c здесь вы идете! –

ответ

0

Большинство Android устройств имеют PowerVR, Mali, Adreno или ядро ​​GPU Vivante, которые являются рендерами все отложенной, плиточной основой. Для этой архитектуры требуется, чтобы операция glClear в начале каждого кадра указывала драйверу OpenGL ES, когда очищались очереди очередей в треугольном треугольнике, а также буфер кадров. Если вы не выполняете glClear, этот проект кэширования работает неправильно, и вы получите странные результаты, которые будут отличаться от одного типа графического процессора к другому. Итак, вы действительно должны сделать glClear.

+0

Я согласен, результаты могут отличаться. Но даже если я не сделаю glClear и не отключу смешение, тогда и он будет ворчать, теперь это беспокоит, почему включение смешивания не работает должным образом. –

+0

Поскольку, если вы отключите смешение, вы говорите, что графический процессор игнорирует текущее содержимое фреймбуфера и перезаписывает их новые результаты. В этом случае не имеет значения, очищаете ли вы предыдущий буфер или нет, потому что его содержимое не повлияет на конечный результат. –

Смежные вопросы