【问题标题】:OpenGL ES on android crashing when calling glCreateShader()android上的OpenGL ES在调用glCreateShader()时崩溃
【发布时间】:2021-10-26 17:19:22
【问题描述】:

除了几个变量名之外,我基本上都虔诚地遵循the guide on the android docs,并且我在片段中呈现。我花了一些时间来注释行,我设法弄清楚了

 public static int loadShader(int type, String shaderCode) {
        int shader = GLES20.glCreateShader(type);
        //System.out.println(shader + " ass");

        //GLES20.glShaderSource(shader, shaderCode);
        //GLES20.glCompileShader(shader);

        //return shader;
        return 0;
    }

glCreateShader 方法使应用程序崩溃。它不返回任何东西,它只是崩溃。类型输入始终是 GLES20.GL_VERTEX_SHADERGLES20.GL_FRAGMENT_SHADER 两者都会崩溃。

我的渲染器类的其余部分看起来像这样

public class OpenGLRenderer implements GLSurfaceView.Renderer {

    private Triangle trangle;

    @Override
    public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) {
        GLES20.glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
        trangle = new Triangle();
    }

    @Override
    public void onSurfaceChanged(GL10 gl10, int i, int i1) {

    }

    @Override
    public void onDrawFrame(GL10 gl10) {
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
        //trangle.draw();
    }


    public static int loadShader(int type, String shaderCode) {
        int shader = GLES20.glCreateShader(type);
        //System.out.println(shader + " ass");

        //GLES20.glShaderSource(shader, shaderCode);
        //GLES20.glCompileShader(shader);

        //return shader;
        return 0;
    }

这是我的三角形类:

public class Triangle {
    private FloatBuffer vertexBuffer;
    private final int shaderProgram;

    private final String vertexShaderCode =
            "attribute vec4 vPosition;" +
            "void main() {" +
            "   gl_Position = vPosition;" +
            "}";
    private final String fragmentShaderCode =
            "precision mediump float;" +
            "uniform vec4 vColor;" +
            "void main() {" +
            "   gl_FragColor = vColor;" +
            "}";

    static float[] triangleCoords = {
            0.0f, 0.5f, 0.0f,
            -0.5f,-0.3f, 0.0f,
            0.5f, -0.3f, 0.0f
    };

    static final int coordsInVertex = 3, vertexCount = triangleCoords.length / coordsInVertex, vertexStride = coordsInVertex * 4;

    private int positionHandle, colorHandle;

    float color[] = {1f, 0f, 0f, 1f};

    public Triangle () {
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(triangleCoords.length*4);
        byteBuffer.order(ByteOrder.nativeOrder());

        vertexBuffer = byteBuffer.asFloatBuffer();
        vertexBuffer.put (triangleCoords);
        vertexBuffer.position(0);

        int vertexShader = OpenGLRenderer.loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode);
        int fragmentShader = OpenGLRenderer.loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);

        shaderProgram = GLES20.glCreateProgram();
        GLES20.glAttachShader(shaderProgram, vertexShader);
        GLES20.glAttachShader(shaderProgram, fragmentShader);
        GLES20.glLinkProgram(shaderProgram);
    }

    public void draw () {
        GLES20.glUseProgram(shaderProgram);
        positionHandle = GLES20.glGetAttribLocation(shaderProgram, "vPosition");
        GLES20.glEnableVertexAttribArray(positionHandle);
        GLES20.glVertexAttribPointer(positionHandle, coordsInVertex, GLES20.GL_FLOAT, false, vertexStride, vertexBuffer);
        colorHandle = GLES20.glGetUniformLocation(shaderProgram, "vColor");
        GLES20.glUniform4fv(colorHandle, 1, color, 0);
        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
        GLES20.glDisableVertexAttribArray(positionHandle);
    }
}

有人能解释一下吗?

【问题讨论】:

    标签: java android opengl-es


    【解决方案1】:

    在您提供的上述来源中没有发现任何问题或错误,并且在连接 GLSurfaceView 时完全可以使用。

    我认为问题在于配置 GLSurfaceView,您必须在 之前明确设置 OpenGL-ES 上下文的 EGLContextClientVersion >setRenderer; 没有 eglContext 的程序将不会执行任何 GL 操作。

    GLSurfaceView view = findViewById(R.id.glview);
    view.setEGLContextClientVersion(2);
    view.setRenderer(new OpenGLRenderer());
    

    【讨论】:

    • 是的。这是确切的问题。不过,我设法自己弄清楚了。无论如何,谢谢哥们。
    猜你喜欢
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多