0

如果我想使用 SurfaceView 上方的任何本机接口,着色器编译将失败。

如果我像这样启动应用程序一切正常:

surfaceView = new mSurfaceView(this);
renderer = new mRender();
surfaceView.setRenderer(renderer);
setContentView(surfaceView);

但如果我想使用任何界面,它就会失败。我正在应用这样的布局:

setContentView(R.layout.main);
surfaceView = (mSurfaceView) findViewById(R.id.gl_surface_view);
renderer = new mRender();
surfaceView.setRenderer(renderer);

应用程序在编译着色器时崩溃。这是我的代码:

protected int compileShader(int shaderType, String shaderCode)
{
    int shaderHandle = GLES20.glCreateShader(shaderType);

    if (shaderHandle != 0)
    {
        // Pass in the shader source.
        GLES20.glShaderSource(shaderHandle, shaderCode);

        // Compile the shader.
        GLES20.glCompileShader(shaderHandle);

        // Get the compilation status.
        final int[] compileStatus = new int[1];
        GLES20.glGetShaderiv(shaderHandle, GLES20.GL_COMPILE_STATUS, compileStatus, 0);

        // If the compilation failed, delete the shader.
        if (compileStatus[0] == 0)
        {
            GLES20.glDeleteShader(shaderHandle);
            shaderHandle = 0;
        }
    }

    if (shaderHandle == 0)
    {
        throw new RuntimeException("Error creating shader.");
    }

    return shaderHandle;
}

着色器未成功编译,因此 shaderHandle 为 0,应用程序在此行崩溃:

throw new RuntimeException("Error creating shader.");

没有布局它编译得很好。我认为问题在于,在第一个变体中,我以这种方式创建布局:surfaceView = new mSurfaceView(this); 但在崩溃变体中,我以这种方式创建它:surfaceView = (mSurfaceView) findViewById(R.id.gl_surface_view); 我认为它因此而崩溃,但我不知道为什么。对我来说它看起来很好,我没有看到问题。

这是 main.xml 中表面视图的外观:

<engine.core.mSurfaceView
    android:id="@+id/gl_surface_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
4

0 回答 0