Urho3D
GameDev.ru / Сообщества / Urho3D / Форум / Ошибка компиляции PBR шейдеров на Android

Ошибка компиляции PBR шейдеров на Android

Поделиться
Страницы: 1 2 Следующая »
AlexS32Пользовательwww1 дек. 201715:31#0
Добрый день.
Собственно столкнулся с проблемой компиляции PBR шейдеров.
Ошибки следующего типа:
ERROR: 0:126: '/' :  wrong operand types  no operation '/' exists that takes a left-hand operand of type 'float' and a right operand of type 'const int' (or there is no acceptable conversion)
ERROR: 0:134: '*' :  wrong operand types  no operation '*' exists that takes a left-hand operand of type 'const int' and a right operand of type 'float' (or there is no acceptable conversion)

Судя по всему где-то в шейдерном коде к константным значениям забыли добавить .0
Одно такое место нашел в BRDF.glsl - 31 строка :
return specular * (f0  + (1 - f0) * pow(2, (-5.55473 * LdotH - 6.98316) * LdotH));
необходимо заменить 2 на 2.0, т.к. нет соответствующей перегруженной функции pow() для integer.

Но осталось еще с десяток подобных ошибок и я не могу понять - есть ли способ заставить Урху выдавать номер строки? Или придется писать какой-то свой отладочный сборщик.

GLoomПостоялецwww1 дек. 201715:36#1
Да, .0 нехватает. Тоже интересно как отлаживать.
codingmonkeyПостоялецwww1 дек. 201718:02#2
разве #line № в заголовке шейдера там не работает?
GLoomПостоялецwww1 дек. 201718:10#3
В ошибке есть строка после разворачивания инлайнов. Или мы про разное?

Я добавлял строку которая заведомо не компилировалась в подозрительное место, получал ее номер в тексте ошибки и отсчитывал разницу.

AlexS32Пользовательwww1 дек. 201718:27#4
Итак, первый этап закончен:
Ошибки в шейдерах: IBL, BRDF, PBR, PBRLitSolid (glsl которые естественно)
Правится легко - ко всем целочисленным константам дописать .0
Для поиска строк с целыми числами можно использовать (заменив ddd на имя файла) нечто такое:
perl -e 'open(F, "<ddd"); while(<F>){ if($_=~/[^a-z\.\d](\d+)[^a-z\.\d]/ig) {  print $_."\n"; }} close(F);'

Правда возможны ложные срабатывания.

Следующий этап.
При попытке запуска урховского семпла 42_PBRMaterials возникают следующие ошибки:

На Galaxy S8:

12-01 18:26:21.798 29048-29157/com.github.urho3d E/Urho3D: Failed to compile pixel shader PBRLitSolid(DIFFMAP IBL METALLIC NORMALMAP PBR ROUGHNESS):
                                                           0:109: L0002: Undeclared variable 'f'
                                                           0:131: L0002: Undeclared variable 'specEnergy'
                                                           0:132: L0002: Undeclared variable 'specEnergy'
12-01 18:26:21.810 29048-29157/com.github.urho3d E/Urho3D: Failed to compile pixel shader PBRLitSolid(IBL PBR):
                                                           0:109: L0002: Undeclared variable 'f'
                                                           0:131: L0002: Undeclared variable 'specEnergy'
                                                           0:132: L0002: Undeclared variable 'specEnergy'
12-01 18:26:21.946 29048-29157/com.github.urho3d E/Urho3D: Failed to compile pixel shader PBRLitSolid(DIRLIGHT IBL PBR PCF_SHADOW PERPIXEL SHADOW SPECULAR):
                                                           0:109: L0002: Undeclared variable 'f'
                                                           0:131: L0002: Undeclared variable 'specEnergy'
                                                           0:132: L0002: Undeclared variable 'specEnergy'
12-01 18:26:21.959 29048-29157/com.github.urho3d E/Urho3D: Failed to compile pixel shader PBRLitSolid(DIFFMAP DIRLIGHT IBL METALLIC NORMALMAP PBR PCF_SHADOW PERPIXEL ROUGHNESS SHADOW SPECULAR):
                                                           0:109: L0002: Undeclared variable 'f'
                                                           0:131: L0002: Undeclared variable 'specEnergy'
                                                           0:132: L0002: Undeclared variable 'specEnergy'
12-01 18:26:22.010 29048-29157/com.github.urho3d E/Urho3D: Failed to compile pixel shader PBRLitSolid(DIFFMAP IBL METALLIC NORMALMAP PBR PERPIXEL POINTLIGHT ROUGHNESS SPECULAR):
                                                           0:109: L0002: Undeclared variable 'f'
                                                           0:131: L0002: Undeclared variable 'specEnergy'
                                                           0:132: L0002: Undeclared variable 'specEnergy'
12-01 18:26:22.021 29048-29157/com.github.urho3d E/Urho3D: Failed to compile pixel shader PBRLitSolid(IBL PBR PERPIXEL POINTLIGHT SPECULAR):
                                                           0:109: L0002: Undeclared variable 'f'
                                                           0:131: L0002: Undeclared variable 'specEnergy'
                                                           0:132: L0002: Undeclared variable 'specEnergy'
12-01 18:26:22.027 29048-29157/com.github.urho3d E/Urho3D: Failed to compile pixel shader PBRLitSolid(DIFFMAP IBL METALLIC NORMALMAP PBR PERPIXEL POINTLIGHT ROUGHNESS):
                                                           0:109: L0002: Undeclared variable 'f'
                                                           0:131: L0002: Undeclared variable 'specEnergy'
                                                           0:132: L0002: Undeclared variable 'specEnergy'
12-01 18:26:22.033 29048-29157/com.github.urho3d E/Urho3D: Failed to compile pixel shader PBRLitSolid(IBL PBR PERPIXEL POINTLIGHT):
                                                           0:109: L0002: Undeclared variable 'f'
                                                           0:131: L0002: Undeclared variable 'specEnergy'
                                                           0:132: L0002: Undeclared variable 'specEnergy'
На Redmi Note 4:
12-01 17:17:00.712 6818-6868/com.github.urho3d I/Adreno: Error: output vTexCoord type mismatch with other stage.
                                                         Error: Input Output Mismatch.
12-01 17:17:00.712 6818-6868/com.github.urho3d E/Urho3D: Failed to link vertex shader PBRLitSolid(NOUV) and pixel shader PBRLitSolid(IBL PBR):
                                                         Error: output vTexCoord type mismatch with other stage.
                                                         Error: Input Output Mismatch.
12-01 17:17:00.752 6818-6868/com.github.urho3d I/Adreno: Error: output vTexCoord type mismatch with other stage.
                                                         Error: Input Output Mismatch.
12-01 17:17:00.752 6818-6868/com.github.urho3d E/Urho3D: Failed to link vertex shader PBRLitSolid(DIRLIGHT NOUV PERPIXEL SHADOW) and pixel shader PBRLitSolid(DIRLIGHT IBL PBR PCF_SHADOW PERPIXEL SHADOW SPECULAR):
                                                         Error: output vTexCoord type mismatch with other stage.
                                                         Error: Input Output Mismatch.
12-01 17:17:00.775 6818-6868/com.github.urho3d I/Adreno: Error: output vTexCoord type mismatch with other stage.
                                                         Error: Input Output Mismatch.
12-01 17:17:00.775 6818-6868/com.github.urho3d E/Urho3D: Failed to link vertex shader PBRLitSolid(NOUV PERPIXEL POINTLIGHT) and pixel shader PBRLitSolid(IBL PBR PERPIXEL POINTLIGHT SPECULAR):
                                                         Error: output vTexCoord type mismatch with other stage.
                                                         Error: Input Output Mismatch.
12-01 17:17:00.795 6818-6868/com.github.urho3d I/Adreno: Error: output vTexCoord type mismatch with other stage.
                                                         Error: Input Output Mismatch.
12-01 17:17:00.795 6818-6868/com.github.urho3d E/Urho3D: Failed to link vertex shader PBRLitSolid(NOUV PERPIXEL POINTLIGHT) and pixel shader PBRLitSolid(IBL PBR PERPIXEL POINTLIGHT):
                                                         Error: output vTexCoord type mismatch with other stage.
                                                         Error: Input Output Mismatch.

Правка: 1 дек. 2017 18:47

codingmonkeyПостоялецwww1 дек. 201718:59#5
>Undeclared variable 'f'
явно твой скрипт потёр имя параметру "f0" (сравни свой код с оригинальными шейдерами в этой же строке с проблемной "f")

>type mismatch with other stage
У GLoom'a на radeon'e тоже что-то с мисматч стейдж связанное было в SAO, хз что это, на нивидии все ок
можно попробовать обрамить дефайнами  VS и PS части и просто продублировать varying'и.

#ifdef COMPILEVS
out vec2 vTexCoord;
//out highp vec2 vTexCoord;
//varying vec2 vTexCoord;
#endif


#ifdef COMPILEPS
in vec2 vTexCoord;
//in highp vec2 vTexCoord;
//varying vec2 vTexCoord;
#endif

заметил NOUV и вспомнил что эта фигня была введена для DX-renderer когда у геометрии вообще нет UV-map'ы (текстурных координат), проще завести их для всей геометрии даже если они не юзаются, забить 0--ми в вершинах.
ну или еще как вариант в Transform.glsl

+ Показать

Правка: 1 дек. 2017 19:40

AlexS32Пользовательwww1 дек. 201719:24#6
f0 все на местах, да скрипт и не меняет ничего, только выводит.

Меня очень настораживает, что на разных девайсах разные ошибки - для Android это фактически указание, на то, что проблема не в тех ошибках которые мы видим, а в нечто общем для них.

GLoomПостоялецwww1 дек. 201719:53#7
Где можно взять затестить? Может на выходных руки дойдут.
ZamirПостоялецwww1 дек. 201720:47#8
Не по теме

AlexS32 ты используешь urho3d или urhosharp? Если первое, сколько добавляет в apk урхо в размере?

PBR пробовал на urhosharp-е в apk, андроид успешно игнорирует его, но без ошибок.

Правка: 1 дек. 2017 20:56

AlexS32Пользовательwww2 дек. 201715:53#9
Zamir
> AlexS32 ты используешь urho3d или urhosharp? Если первое, сколько добавляет в
> apk урхо в размере?
Я использую Urho3d - сколько добавляет скажу точно в понедельник, но вроде сама либа около 13Мб, ну а ресурсы до бесконечности)))

AlexS32
> 0:109: L0002: Undeclared variable 'f'
> 0:131: L0002:
> Undeclared variable 'specEnergy'
codingmonkey
> явно твой скрипт потёр имя параметру "f0" (сравни свой код с оригинальными
> шейдерами в этой же строке с проблемной "f")

Все проще оказалось - в 13 строке PBR.glsl объявление и инициализация: float specEnergy = 1.0f;
Так вот f - лишняя. Причем, что характерно для девайсов под Android для кого-то лишняя, для какого-то нет - компилятор ругался только у Galaxy S8.
Кстати в этом же шейдере еще одна f в 35 строке:
specEnergy = rough2 / (rough2 + 0.5f * sphereAngle);

Теперь же оставшиеся ошибки у обоих девайсов совпадают.
Дальше уже только в понедельник продолжить смогу.

Правка: 2 дек. 2017 15:55

codingmonkeyПостоялецwww3 дек. 20179:33#10
>Все проще оказалось
отлично, но было бы лучше если бы этого вообще не было )

глянул вики использование f вроде допускается в glsl https://www.khronos.org/opengl/wiki/Data_Type_(GLSL)
>Literals
>A numeric literal that uses a decimal is by default of type float. To create a float literal from an integer value, use the suffix f or F as in C/C++.

Правка: 3 дек. 2017 9:33

AlexS32Пользовательwww4 дек. 201711:17#11
codingmonkey
> глянул вики использование f вроде допускается в glsl
> https://www.khronos.org/opengl/wiki/Data_Type_(GLSL)
Тут сказывается некоторое отставание Урхи в части мобильных платформ - до сих пор используется OpenGL ES 2.0 и соответственно GLSL 1.x
В спецификации типа float суффикс f отсутствует https://www.khronos.org/registry/OpenGL/specs/es/2.0/GLSL_ES_Spec… tion_1.00.pdf
появляется же этот суффикс только в GLSL 3.0:
  
floating-suffix: one of
  f F
https://www.khronos.org/registry/OpenGL/specs/es/3.0/GLSL_ES_Spec… tion_3.00.pdf

> Zamir
> > AlexS32 ты используешь urho3d или urhosharp? Если первое, сколько добавляет в
> > apk урхо в размере?
> Я использую Urho3d - сколько добавляет скажу точно в понедельник, но вроде сама
> либа около 13Мб, ну а ресурсы до бесконечности)))
Еще раз посмотрел по размерам - в настоящий момент я использую статическую линковку, что в итоге дает +3-4MB
При динамической линковке libUrho3d.so весит как я и писал - 13MB

Правка: 4 дек. 2017 11:19

AlexS32Пользовательwww4 дек. 201716:53#12
Собственно более-менее заработало. Осталась проблема с общим освещением - работают только локальные источники. Соответственно не оценить пока на сколько хорошо в металлических шарах отражается окружающая обстановка.
Основная проблема оказалась в дефайне в PBRLitSolid:
#if defined(NORMALMAP) || defined(IBL)
    varying vec4 vTexCoord;
    varying vec4 vTangent;
#else
    varying vec2 vTexCoord;
#endif
Для большинства техник получилось, что для PS был задан IDL, а для VS нет. Соответственно в одном случае vTexCoord имел тип vec4 и vec2 в другом.
Я добавил определение IDLVS  во всех материалах, где для VS не хватало определения. Код PBRLitSolid изменил так:
1.Приведенный выше дефайн расширил
#if defined(NORMALMAP) || defined(IBL) || defined(IBLVS)
    varying vec4 vTexCoord;
    varying vec4 vTangent;
#else
    varying vec2 vTexCoord;
#endif
и в 66ой строке изменил
  vTexCoord= GetTexCoord(iTexCoord);
на
  vTexCoord.xy = GetTexCoord(iTexCoord);
Что с освещение пока понять не могу.
GLoomПостоялецwww4 дек. 201717:00#13
> Что с освещение пока понять не могу.
Насколько я помню в шейдере на OpenGL ES 2.0 не прокидывается глобальная cube map от зоны, только локальная. В каменте написано что это ограничение OpenGL ES 2.0 но почему так я не знаю.
        // OpenGL ES does not support textureLod without extensions and does not have the sZoneCubeMap sampler,
        // so for now, sample without explicit LOD, and from the environment sampler, where the zone texture will be put
        // on mobile hardware
        #ifndef GL_ES
            vec3 cube = textureLod(sZoneCubeMap, FixCubeLookup(reflectVec), mipSelect).rgb;
            vec3 cubeD = textureLod(sZoneCubeMap, FixCubeLookup(wsNormal), 9.0).rgb;
        #else
            vec3 cube = textureCube(sEnvCubeMap, FixCubeLookup(reflectVec)).rgb;
            vec3 cubeD = textureCube(sEnvCubeMap, FixCubeLookup(wsNormal)).rgb;
        #endif

Оно?

AlexS32Пользовательwww4 дек. 201718:09#14
GLoom
Видимо оно. Я правильно понимаю, что с построением отражения в поверхностях будут проблемы?
В первую очередь меня интересует получения отражения в полупрозрачном объекте - фактически эффект "отсвечивания" в стекле
Страницы: 1 2 Следующая »

/ Форум / Urho3D - игровой движок / ЗАДАВАЙТЕ ВОПРОСЫ

2001—2017 © GameDev.ru — Разработка игр