добавление переменной в fragment shader прерывает рендеринг с использованием opengl GLES20 на Android

#android #opengl-es #opengl-es-2.0

#Android #opengl-es #opengl-es-2.0

Вопрос:

Я пытаюсь рендерить 3D-сетку на Android, позиции вершин указаны следующим образом:

         var positionHandle = GLES20.glGetAttribLocation(program, "vPosition").also {
            GLES20.glEnableVertexAttribArray(it)

            GLES20.glVertexAttribPointer(
                it, 3, GLES20.GL_FLOAT, false, 12, vertexBuffer
            )
        }
  

Мой вершинный шейдер:

     uniform mat4 uMVPMatrix;
    attribute vec4 vPosition;
    varying vec4 positionOut;
    void main() {
      gl_Position = uMVPMatrix * vPosition;
      positionOut = vPosition;
    }
  

Фрагментный шейдер:

     varying vec4 positionOut;
    precision mediump float;
            void main() {
               gl_FragColor = vec4(1, 0,1,1);
            }
  

Этот код отлично работает на одном устройстве (Android 9 на устройстве OnePlus), но он не работает на Samsung Galaxy (Android 10), и никаких ошибок не выдается.

Если я удалю строку varying vec4 positionOut; из фрагментного шейдера, рендеринг сработает. Вопрос в том, почему только определение переменной переменной нарушает рендеринг? Я не использую переменную сейчас, но я хочу использовать ее на следующем шаге.

Комментарии:

1. Возможно, вам нужно установить оператор precision перед объявлением переменной positionOut.

2. Это не помогло @alex

3. no errors are thrown — @derhass, похоже, обнаружил ошибку, но есть еще одна проблема, из-за которой вам не удалось обнаружить ошибку, которая должна быть легко обнаружена. Вот некоторый пример кода, показывающий, как обнаруживать ошибки компиляции и компоновки — не уверен, что это точный правильный диалект OpenGL, но он должен быть достаточно близок.

Ответ №1:

Ваш код недействителен в соответствии со спецификацией:

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

Таким образом, вам либо нужно объявить это как, например, varying mediump ec4 positionOut; , либо вы помещаете в некоторую область precision заявления.