0

Я использую рендеринг на экране для 2D-текстуры. В моем первом шейдере будут отображаться значения YUV, а второй шейдер фрагмента считывает YUV из внеэкранной текстуры. Во втором шейдере я управляю U и V и делаю его между -0,5 до 0,5 диапазона. Но они зажимаются от 0 до 1 (положительные), как только я пытаюсь это сделать. Все мои отрицательные значения становятся 0.Android: отрицательные значения для внеэкранной текстуры зажаты до 0

Найдено этот вопрос здесь:

GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 
       width, height, 0, GLES20.GL_RGBA, 
       GLES20.GL_UNSIGNED_BYTE, null) 

Если я использую GL_FLOAT вместо GL_UNSIGNED_BYTE, это даст мне ошибку в формате цвет не соответствует. По ссылке https://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexImage2D.xml выглядит так, как будто все поддерживаемые форматы будут зажимать до 0-1 диапазона. Как получить отрицательные значения и в следующей текстуре.

Установлено, что я могу использовать другие форматы изображений, такие как GL_R16F, но ни один из них не поддерживается в ссылке/в GLES20.

ответ

1

Не могли бы вы продолжить использование GL_UNSIGNED_BYTE, а просто переназначить значения UV от диапазона -1 до 1 до диапазона 0 до 1, прежде чем записывать их в первый шейдер. Затем, прочитав их во втором шейдере, вы вернетесь назад от диапазона 0 до 1 в диапазон от -1 до 1.

Это дополнительный дополнительный умножитель в каждом из ваших шейдеров и сэкономит значительное количество памяти/полосы текстуры.

например. Конец шейдера 1

vShader1Output = vUVBetweenNeg1And1 * vec2(0.5, 0.5) + vec2(0.5, 0.5); 

, например. Начало шейдера 2

vShader2Input = vUVFromShader1Texture * vec2(2.0, 2.0) - vec2(1.0, 1.0) 
0

я мог бы решить эту проблему с ниже изменения:

окончательное ИНТ GL_HALF_FLOAT_OES = 0x8D61;

GLES20.glTexImage2D (GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, ширина, высота, 0, GLES20.GL_RGBA, GL_HALF_FLOAT_OES, NULL);

 Смежные вопросы

  • Нет связанных вопросов^_^