gpt4 book ai didi

android - OpenGL ES 模板缓冲区不适用于特定设备

转载 作者:行者123 更新时间:2023-11-29 01:45:46 28 4
gpt4 key购买 nike

我正在使用 OpenGL ES 2.0,并使用模板缓冲区。下面是我制作的一个简单的 Stencil Buffer Demo 的代码。 Stenciling 只能在一台设备上正常工作。

设备如下:

Android 4.2.2、PowerVR SGX 544MP (GPU)、Allwinner A10 平板电脑。 (模板缓冲区在此设备上完美运行)

Android 4.1.2、Adreno 225 (GPU)、Galaxy S III 手机。 (Stencil Buffer 不工作,一些闪烁的模板很少有重影。

Android 4.2.2, Mali-400MP (GPU), Rockchip rk30sdk 平板。 (在最初的测试中,Stencil Buffer 没有工作,经过多次更改后它现在似乎可以工作,状态是有问题的。目前尚不清楚修复操作中 Stencil Buffer 的具体更改)

相同的最新 .APK 给出了上述结果。

来自“Play Store”的应用程序“OpenGL 3D Showcase”在所有三台设备上运行,“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 );

}

初始化:

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);

}

初始化2:

已尝试所有评论的“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 帮助我吗?)

最佳答案

在您提供的代码中,您设置了 glStencilMask(0xFF),然后设置了 glStencilMask(0x00)。 OpenGL 是一个状态机,所以无论您最后设置什么,都是当前值——即使您清除了。默认模板掩码值为 255,因此您的 glClear 在第一帧上工作。但在那之后,模板掩码为 0(因为您这样设置),因此模板缓冲区不会被清除。在函数的顶部执行此操作:

public void onDrawFrame(GL10 glUnused) {
// Clear the rendering surface.
glStencilMask(0xFF);
glClear( GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT );
...
}

glStencilMask 函数设置写掩码——清除是一个写操作,因此您通常应该在清除时将所有模板位设置为可写。

关于android - OpenGL ES 模板缓冲区不适用于特定设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21616147/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com