Я использую OpenGL ES 2.0 и используя буфер трафарета. Ниже приведен код из простой пробной версии Stencil Buffer, которую я сделал. Трафайлинг работает только на одном устройстве.Буфер OpenGL ES Stencil, не работающий на определенных устройствах
устройства заключаются в следующем:
Android 4.2.2, PowerVR SGX 544MP (GPU), Allwinner А10 таблетки. (Stencil Buffer отлично работает на этом устройстве)
Android 4.1.2, Adreno 225 (GPU), Galaxy S III Phone. (Буфер Stencil не работает, некоторые редко мерцают с призрачным изображением трафарета.
Android 4.2.2, планшет Mali-400MP (GPU), планшет Rockchip rk30sdk (при первоначальном тестировании Buffer Stencil не работал, после многих изменяет теперь, кажется, работает, статус сомнителен. Конкретные изменения, которые устранены в колёсах Трафарет буфера неизвестных на данный момент)
то же самое последнее .apk дал вышеприведенные результаты.
Application «OpenGL 3D Showcase» из «Play Store» был запущен на всех трех устройствах, а «showcase» # 18 «Stencil Buffer Shadows» [OGL 1.1] отлично работает без сообщений об ошибках. Исходный код снабжен приложением и был просмотрен безрезультатно.
Ниже мой Трафарет код:
public void onDrawFrame(GL10 glUnused) {
// Clear the rendering surface.
glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
multiplyMM(viewProjectionMatrix, 0, projectionMatrix, 0, viewMatrix, 0);
invertM(invertedViewProjectionMatrix, 0, viewProjectionMatrix, 0);
//Start using the stencil
glEnable(GL_STENCIL_TEST);
//Disable rendering to the color buffer
glColorMask(false, false, false, false);
//Place a 1 where rendered
glStencilFunc(GL_ALWAYS, 1, 1);
//Replace where rendered
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
glDisable(GL_DEPTH_TEST);
glStencilMask(0xFF);//value used when writing to stencil buffer
// draw stencil triangle
rotateObjectInScene(0.0f, 0.0f, 0.0f);//x,y,z Object is rottated one full rotation ever 3 seconds within
colorProgram.useProgram();
colorProgram.setUniforms(modelViewProjectionMatrix, 0f, 0f, 1f);
DemoTriangleStencilObj.bindData(colorProgram);
DemoTriangleStencilObj.draw();
//Reenable color
glColorMask(true, true, true, true);
//Where a 1 was not rendered
glStencilFunc(GL_EQUAL, 1, 1);//GL_EQUAL GL_NOTEQUAL
//Keep the pixel
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
glStencilMask(0x00);//disable writing to stencil buffer by setting value used to 0.
positionObjectInScene1(0.0f, 0.0f, 0.0f);//leave image/object fixed in center of screen
textureProgram1.useProgram();
textureProgram1.setUniforms(modelViewProjectionMatrix, texture_opengl);
openglImageDemoObj.bindData(textureProgram1);
openglImagerectanDemoObj.draw();
//Finished using stencil
glDisable(GL_STENCIL_TEST);
}
Init:
public void onSurfaceCreated(GL10 glUnused, EGLConfig config) {
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
}
public void onSurfaceChanged(GL10 glUnused, int width, int height) {
// Set the OpenGL viewport to fill the entire surface.
glViewport(0, 0, width, height);
// Landscape
orthoM(projectionMatrix, 0, -1, 1, -1f, 1f, -1f, 20f);
setLookAtM(viewMatrix, 0, 0f, 2.0f, 0.1f, 0.0f, 0f, 0f, 0f, 1f, 0f);
}
Init2:
Все прокомментировал вызовы '' setEGLConfigChooser были опробованы.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Remove title bar
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
//Remove notification bar
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
//setContentView(R.layout.activity_fist_open_glproject_aactivity);
glSurfaceView = new GLSurfaceView(this);
final TheSurfaceRenderer theSurfaceRenderer = new TheSurfaceRenderer(this);
this.getApplicationContext();
final ActivityManager activityManager =
(ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
final ConfigurationInfo configurationInfo =
activityManager.getDeviceConfigurationInfo();
//final boolean supportsEs2 = false;//configurationInfo.reqGlEsVersion >= 0x20000;
final boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x20000;
if (supportsEs2) {
// Request an OpenGL ES 2.0 compatible context.
glSurfaceView.setEGLContextClientVersion(2);
//glSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);//when use emulator, may be needed.
glSurfaceView.setEGLConfigChooser(new MultiSampleConfigChooser());
//glSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 8);
//glSurfaceView.setEGLConfigChooser(5,6,5,0,24,8);
//glSurfaceView.setEGLConfigChooser(5,6,5,0,16,8);
//glSurfaceView.setEGLConfigChooser(5,6,5,8,16,8);
// Assign our renderer.
//glSurfaceView.setRenderer(new AirHockeyRenderer(this));
glSurfaceView.setRenderer(theSurfaceRenderer);
rendererSet = true;
//Toast.makeText(this, "Renderer started", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, "This device does not support OpenGL ES 2.0.",
Toast.LENGTH_LONG).show();
return;
}
setContentView(glSurfaceView);
}
Любые идеи для отслеживания проблемы? В любом случае, где бы я мог получить помощь? (Если нужно, можете связаться с MFG/Android/Google, чтобы получить меня где-нибудь?)
Любые новости по этому вопросу? На некоторых устройствах есть аналогичная проблесковая проблема. – Veljko