#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
заявления.