Форум программистов, компьютерный форум CyberForum.ru

OpenGL ES 2.0 Шейдер работает только на эмуляторе - Android

Восстановить пароль Регистрация
 
contedevel
 Аватар для contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 589
01.02.2015, 16:33     OpenGL ES 2.0 Шейдер работает только на эмуляторе #1
Здравствуйте!
Возникла проблема с шейдером "тайлинг с отражением". На эмуляторе GENYMOTION различных версий Android все отлично... На реальном устройстве (Samsung Galaxy Win GT-I8552) выдает ошибку.
Вот код фрагментного шейдера:
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
precision mediump float;
 
uniform sampler2D sTexture;
uniform vec2 uv0;
uniform vec2 uv1;
uniform vec2 vTileCount;
 
varying vec2 vTextureCoordinates;
 
void main(void) {
     vec2 delta = uv1 - uv0;
     vec2 uv = delta * vTextureCoordinates * vTileCount;
     vec2 tile = mod(floor(uv / delta), vec2(2, 2));
 
     vec2 uvInverse = delta - mod(uv, delta);
     uv = mix(uv, uvInverse, ceil(tile / 2)) + uv0;
 
     gl_FragColor = texture2D(sTexture, uv);
}


Лог:
Кликните здесь для просмотра всего текста
02-01 15:33:38.320 11979-11979/com.contedevel.lastlegend D/dalvikvm﹕ Late-enabling CheckJNI
02-01 15:33:38.720 11979-11979/com.contedevel.lastlegend D/ActivityThread﹕ setTargetHeapUtilization:0.25
02-01 15:33:38.720 11979-11979/com.contedevel.lastlegend D/ActivityThread﹕ setTargetHeapIdealFree:8388608
02-01 15:33:38.720 11979-11979/com.contedevel.lastlegend D/ActivityThread﹕ setTargetHeapConcurrentStart:2097152
02-01 15:33:39.300 11979-11979/com.contedevel.lastlegend D/libEGL﹕ loaded /system/lib/egl/libEGL_adreno200.so
02-01 15:33:39.340 11979-11979/com.contedevel.lastlegend D/libEGL﹕ loaded /system/lib/egl/libGLESv1_CM_adreno200.so
02-01 15:33:39.340 11979-11979/com.contedevel.lastlegend D/libEGL﹕ loaded /system/lib/egl/libGLESv2_adreno200.so
02-01 15:33:39.350 11979-11979/com.contedevel.lastlegend I/Adreno200-EGL﹕ <qeglDrvAPI_eglInitialize:299>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_JB_REL_2.0.3.04.01.02.21.119_msm8625_JB_REL_2.0.3_CL3357771_release_AU (CL3357771)
Build Date: 04/04/13 Thu
Local Branch:
Remote Branch: m/jb_rel_2.0.3
Local Patches: NONE
Reconstruct Branch: AU_LINUX_ANDROID_JB_REL_2.0.3.04.01.02.21.119 + NOTHING
02-01 15:33:39.500 11979-11979/com.contedevel.lastlegend D/OpenGLRenderer﹕ Enabling debug mode 0
02-01 15:33:45.840 11979-11979/com.contedevel.lastlegend W/IInputConnectionWrapper﹕ getSelectedText on inactive InputConnection
02-01 15:33:45.840 11979-11979/com.contedevel.lastlegend W/IInputConnectionWrapper﹕ setComposingText on inactive InputConnection
02-01 15:38:17.940 11979-11979/com.contedevel.lastlegend W/SurfaceView﹕ CHECK surface infomation creating=false formatChanged=false sizeChanged=false visible=false visibleChanged=true surfaceChanged=true realSizeChanged=false redrawNeeded=false left=false top=false
02-01 15:38:18.420 11979-11979/com.contedevel.lastlegend E/SpannableStringBuilder﹕ SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
02-01 15:38:18.430 11979-11979/com.contedevel.lastlegend E/SpannableStringBuilder﹕ SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
02-01 15:38:38.440 13217-13217/com.contedevel.lastlegend D/ActivityThread﹕ setTargetHeapUtilization:0.25
02-01 15:38:38.440 13217-13217/com.contedevel.lastlegend D/ActivityThread﹕ setTargetHeapIdealFree:8388608
02-01 15:38:38.440 13217-13217/com.contedevel.lastlegend D/ActivityThread﹕ setTargetHeapConcurrentStart:2097152
02-01 15:38:38.750 13217-13217/com.contedevel.lastlegend D/libEGL﹕ loaded /system/lib/egl/libEGL_adreno200.so
02-01 15:38:38.770 13217-13217/com.contedevel.lastlegend D/libEGL﹕ loaded /system/lib/egl/libGLESv1_CM_adreno200.so
02-01 15:38:38.780 13217-13217/com.contedevel.lastlegend D/libEGL﹕ loaded /system/lib/egl/libGLESv2_adreno200.so
02-01 15:38:38.820 13217-13217/com.contedevel.lastlegend I/Adreno200-EGL﹕ <qeglDrvAPI_eglInitialize:299>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_JB_REL_2.0.3.04.01.02.21.119_msm8625_JB_REL_2.0.3_CL3357771_release_AU (CL3357771)
Build Date: 04/04/13 Thu
Local Branch:
Remote Branch: m/jb_rel_2.0.3
Local Patches: NONE
Reconstruct Branch: AU_LINUX_ANDROID_JB_REL_2.0.3.04.01.02.21.119 + NOTHING
02-01 15:38:38.960 13217-13217/com.contedevel.lastlegend D/OpenGLRenderer﹕ Enabling debug mode 0
02-01 15:38:39.130 13217-13217/com.contedevel.lastlegend W/IInputConnectionWrapper﹕ showStatusIcon on inactive InputConnection
02-01 15:38:40.670 13217-13232/com.contedevel.lastlegend W/Adreno200-ES20﹕ <qgl2DrvAPI_glUseProgram:1407>: GL_INVALID_OPERATION


Я плохо разбираюсь в OpenGL, но кажется, что не поддерживается какая-то из функций шейдера. Потому что этот фрагментный шейдер работает отлично и там, и там:
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
precision mediump float;
 
uniform sampler2D sTexture;
uniform vec2 uv0;
uniform vec2 uv1;
uniform vec2 vTileCount;
 
varying vec2 vTextureCoordinates;
 
void main(void) {
     vec2 delta = uv1 - uv0;
     vec2 uv = delta * vTextureCoordinates * vTileCount;
     uv = mod(uv, delta);
     uv = uv + uv0;
     gl_FragColor = texture2D(sTexture, uv);
}


В чем может быть проблема?

Добавлено через 51 минуту
Ошибка конкретно в функции ceil(), без нее работает, но неправильно...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.02.2015, 16:33     OpenGL ES 2.0 Шейдер работает только на эмуляторе
Посмотрите здесь:

Android RSS-читалка - работает на эмуляторе, не работает на реальном девайсе
Android Реклама в эмуляторе Android
Работа с файлами на эмуляторе Android
Android VideoView на эмуляторе
Приложение в телефоне работает корректно только в эмуляторе Android
Android На эмуляторе работает, а в смартфоне нет
Android Не загружается меню на эмуляторе
NDK некорректно загружаются данные в шейдер Android
Не запускается в эмуляторе приложение Android
Android Layout-large не работает в эмуляторе
DPI в эмуляторе Android
Android Микрофон в эмуляторе Genymotion

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
EVP
317 / 239 / 42
Регистрация: 14.12.2010
Сообщений: 460
01.02.2015, 19:14     OpenGL ES 2.0 Шейдер работает только на эмуляторе #2
Вместо 16-ой строчки:
C
1
uv = mix(uv, uvInverse, ceil(tile / vec2(2,2))) + uv0;
Цитата Сообщение от contedevel Посмотреть сообщение
выдает ошибку.
Причину поломки шейдера можно узнать:
Java
1
2
if (!shaderCompiled)
    Log.e("Shader", GLES20.glGetShaderInfoLog(shader));
contedevel
 Аватар для contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 589
01.02.2015, 19:53  [ТС]     OpenGL ES 2.0 Шейдер работает только на эмуляторе #3
Цитата Сообщение от EVP Посмотреть сообщение
Причину поломки шейдера можно узнать:
Спасибо, сейчас посмотрю!

Добавлено через 21 минуту
Цитата Сообщение от EVP Посмотреть сообщение
Вместо 16-ой строчки:
Пробовал так делать ошибка уходила, но текстура отображалась непонятно как...
Оказалось, что это корректная запись:
C
1
2
uv = mod(uv, delta);
     vec2 uvInverse = delta - uv;
А эта нет:
C
1
vec2 uvInverse = delta - mod(uv, delta);
Не заметил, что далее используется результат, записанный в uv... Хотел код сократить немного и сам же себе ошибку сделал.

А эта запись tile/2 реально на Adreno ошибку кидает.
EVP
317 / 239 / 42
Регистрация: 14.12.2010
Сообщений: 460
01.02.2015, 20:02     OpenGL ES 2.0 Шейдер работает только на эмуляторе #4
Цитата Сообщение от contedevel Посмотреть сообщение
А эта запись tile/2 реально на Adreno ошибку кидает.
Компиляторы OpenGL ES 2.0 - упрощённые версии настольных, поэтому не все операторы применимы.
Эмулятор использует компилятор десктопный для компиляции, поэтому на нём не было ошибки.
А компилятор Opengl ES более простой и не понимает этой инструкции.
contedevel
 Аватар для contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 589
01.02.2015, 20:03  [ТС]     OpenGL ES 2.0 Шейдер работает только на эмуляторе #5
Цитата Сообщение от EVP Посмотреть сообщение
Компиляторы OpenGL ES 2.0 - упрощённые версии настольных, поэтому не все операторы применимы.
Эмулятор использует компилятор десктопный для компиляции, поэтому на нём не было ошибки.
А компилятор Opengl ES более простой и не понимает этой инструкции.
Спасибо, буду знать!
Я на видеокарту подумал)
Yandex
Объявления
01.02.2015, 20:03     OpenGL ES 2.0 Шейдер работает только на эмуляторе
Ответ Создать тему
Опции темы

Текущее время: 03:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru