Android OpenGL ES 3.0 не работают - PullRequest
3 голосов
/ 14 марта 2020

Я использую openGl ES 3.0 в android для рендеринга прямоугольника на экране, и я хочу использовать шейдеры для генерации сочетания цветов в зависимости от положения вершин.

Я уверен, что проблема в том, в вершине и в коде фрагментного шейдера, но я не знаю, что это, это коды шейдера:

 private final String vertexShaderCode =

            "#version 300 es"+
            "in vec3 position;" +
            "out vec3 color;"+

                    "void main() {" +
                    "  gl_Position = vec4(position.x,position.y,position.z,1.0);" +
                    "  color = vec3(position.x+0.5,1.0,position.y+0.5);"+
                    "}";




    private final String fragmentShaderCode =

                    "#version 300 es"+
                    "in vec3 color;"+
                    "out vec4 out_color;"+


                    "void main() {" +
                    "  out_color= vec4(color.x,color.y,color.z,1.0);" +
                    "}";

Я пытаюсь заполнить форму цветом в зависимости от положения вершины, поэтому это смесь сгенерированных цветов для каждого пикселя.

Но я не понимаю, почему он не работает?

ОБНОВЛЕНИЕ:

У меня есть 3 информации :

  • Ошибка ссылки из-за недопустимого вершинного шейдера.

  • Неизвестна языковая версия '300', этот компилятор поддерживает только до версии '320 es '

  • Неожиданный текст найден после директивы #version.

Ответы [ 2 ]

3 голосов
/ 14 марта 2020

Ваш код шейдера не компилируется успешно, потому что вы пропустили переводы строки (\n). Объявление версии должно быть в отдельной строке:

"#version 300 es\n"+

См. OpenGL ES Shading Language 3.00 Спецификация - 3.4 Объявление версии :

#version директива должна присутствовать в первой строке шейдера и должна сопровождаться новой строкой.


Кроме того, вы должны добавить прецизионный прецизионный параметр для переменных с плавающей запятой в фрагментный шейдер. Например:

"#version 300 es\n"+
"precision mediump float;\n"+

См. OpenGL ES Shading Language 3.00 Спецификация - 4.5.4 Спецификаторы точности по умолчанию :

Язык фрагментов не имеет квалификатора точности по умолчанию для типы с плавающей точкой. Следовательно, для объявлений с плавающей запятой, вектора с плавающей запятой и матричной переменной либо объявление должно включать прецизионный прецизионный метод, либо точность с плавающей запятой по умолчанию должна быть объявлена ​​ранее.

2 голосов
/ 14 марта 2020

Вы можете отобразить ошибки шейдера следующим образом:

    GLES20.glAttachShader(program, vertexShader);
    GLES20.glAttachShader(program, pixelShader);
    GLES20.glLinkProgram(program);
    int[] linkStatus = new int[1];
    GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0);
    if (linkStatus[0] != GLES20.GL_TRUE) {
        GLES20.glDeleteProgram(program);
        throw new RuntimeException("Could not link program: "
                + GLES20.glGetProgramInfoLog(program));
    }

Удалось ли отобразить любую цветовую форму? Может быть много причин, почему фигуры не отображаются. Но если дело только в цветах, это сужает область поиска.

...