foxes
Мне хотелось бы посмотреть на внутренность этого компонента, как код написан. Только я не знаю, в какой из юнитивских библиотек его можно найти...
lusyok
> Только я не знаю, в какой из юнитивских библиотек его можно найти...
Ни в какой, код закрыт.
foxes
> Ооо, это никакого отношение к ветвлениям не имеет. Скорее всего ты что-то в
> своем шейдере откуда то скопировал. В unity очень вредный компилятор, он выдает
> ошибку если в тексте появляется какой нибудь не печатаемый спец символ (обычно
> перенос строки), или ты просто последовательность обявления не очевидно
> напутал. Я обычно в таких случаях просто переписываю весь шейдер посимвольно
> вручную.
Была такая мысль, но весь шейдер написан вручную, а ошибка пропадала, если закомментировать одну из строк с max() через ~80 строк ниже по тексту. Перенёс оба max() из геометрического шейдера в вершинный, и OpenGL c Вулканом перестали ругаться.
> Мало того функция MAX/MIN - это не ветвления, они есть как команды ассемблера.
Вот фиг их знает. Где-то попадалось, что step() то ли всегда, то ли в каких-то случаях реализуется через if ― условный переход в ассемблере. Что пишешь if, что пишешь step() ― ассемблер одинаковый. А у меня как раз на step(), max() и if {} одна и та же ошибка.
alexzzzz
> Была такая мысль, но весь шейдер написан вручную
Все равно этого не должно быть. Я в геометрическом шейдере много чего писал.
foxes
> Я в геометрическом шейдере много чего писал.
Именно в OpenGLCore/OpenGL ES 3/Vulkan? В DirectX всё работает без проблем. Я и не подозревал, что что-то не так, пока не переключил API на OpenGL.
Кстати, когда проблемный шейдер редактируешь и сохраняешь, Unity не находит в нём ошибок. Они вылезают в консоли или журнале потом, как только пытаешься этот шейдер использовать. Какая-то отложенная компиляция там происходит. Может, от драйвера видеокарты зависит, или кто там компилирует OpenGL-шейдеры уже для непосредственного использования... Хотя если в редакторе в режиме OpenGL шейдер не работает, то на Android-телефонах тоже ничего не рисуется.
alexzzzz
> Какая-то отложенная компиляция там происходит.
В GL шейдер компилируется драйвером, если приставку opengl.dll можно таковым назвать. Только DX принимает уже "скомпилированный" код, который легко конвертится в бинарник, для gl unity просто транслирует hlsl в glsl.
Там же можно посмотреть что компилирует unity для каждой платформы.
alexzzzz
> Может, от драйвера видеокарты зависит
Возможно что сама unity косячит. Новая версия?
foxes
> В GL шейдер компилируется драйвером, если приставку opengl.dll можно таковым назвать.
А кто/где компилирует шейдеры для Андроида? GLSL компилируется в рабочий код непосредственно на устройстве или заранее при сборке билда? Потому что если в Unity режиме в OpenGL не работает, то на устройстве тоже не работает. А когда работает, то тоже и там, и там.
> Там же можно посмотреть что компилирует unity для каждой платформы.
Мало толку. Компилятор нашёл какую-то целочисленную константу/литерал там, где не ожидал:
GLSL compilation failed:
0(26) : error C0000: syntax error, unexpected integer constant, expecting reserved word or reserved word "precise" at token "<int-const>"
Вот исходный шейдер:
struct VertexData { <---- это строка 26 float4 start : SV_POSITION; float4 end : POSITION1;
Вот «скомпилированный» шейдер:
... ////////////////////////////////// // // // Compiled programs // <---- это строка 26 // // ////////////////////////////////// ...
Когда нажимаешь кнопочку Compile and show code, показывается весьма условно скомпилированный код. Там остаётся ещё куча директив условной компиляции, и кто-то потом должен это докомпилировать до полной готовности.
> Возможно что сама unity косячит. Новая версия?
Да не, последний 2018 LTS. И в 2019 LTS то же самое.
alexzzzz
> GLSL компилируется в рабочий код непосредственно на устройстве или заранее при
> сборке билда?
При работе приложения на устройстве.
alexzzzz
> А когда работает, то тоже и там, и там.
Ну понятно что если unity не выдаст glsl то ни фига не будет.
alexzzzz
> syntax error, unexpected integer constant, expecting reserved word or reserved
> word "precise" at token "<int-const>"
Недавно делал пример Cull face с геометрическим шейдером и такая же фигня была. Хотел спросить здесь, но вспомнил что это баян. Все исправил, помню что тривиально, но не помню как. Теперь ты на этих граблях. :)))
Добавил лишь этот код и также на структуру ругаться начал.
Ради теста сейчас в уже рабочем поменял на это, но проблем нет.
alexzzzz
> float4 start : SV_POSITION;
> float4 end : POSITION1;
Вот эти вот POSITION1, SV_POSITION и прочие директивы на самом деле очень конфликтуют между собой.
У меня только что gl ругнулся на FOG директиву, что TEXCOORD1 и TEXCOORD2 уже используется.
struct v2f { float2 uv : TEXCOORD0; UNITY_FOG_COORDS(1) float4 vertex : SV_POSITION; UNITY_VERTEX_INPUT_INSTANCE_ID };
alexzzzz
> Мало толку.
У тебя на стрелочке должны выбираться платформы.
alexzzzz
> Когда нажимаешь кнопочку Compile and show code,
Должен получиться огромный исходник с ключевыми словами
-- Vertex shader for "glcore":
...
-- Geometry shader for "d3d11":
...
После чего можно найти один из вариантов скомпилированного кода OpenGl для glsl. Который можно будет прямо в стандартном OpenGL приложении на С++ или еще чем-то использовать.
Для DX будет ассемблер
Вот эта шляпа уже во время работы приложения компилируется "драйверами". И в этом же тексте может быть пустой код или код с ошибками. Прямо тут в тексте сообщение об ошибке может быть написано.
Пока загадка. Если COLOR3 из сообщения об ошибке поменять на что-то другое, ругается точно так же, но уже на это другое.
GLSL compilation failed:
0(19) : error C0000: syntax error, unexpected integer constant, expecting reserved word or reserved word "precise" at token "<int-const>"
0(34) : error C1503: undefined variable "vs_COLOR3"
0(34) : error C1066: invalid type in type constructor
Если считать первое упоминание vs_COLOR3 в шейдере строкой 34, то получается так:
Единственное, что связывает этот vs_COLOR3 с функцией max(), это что значение из этого поля vs_COLOR3 читается в геометрическом шейдере в локальную переменную, над которой и выполняется max(). Но со значением из vs_COLOR2 выполняется абсолютно точно такая же операция и в коде она происходит раньше, но к нему почему-то претензий нет. Т.е. один раз сделать max, if или step можно, а два раза уже нельзя.
alexzzzz
> Пока загадка.
Просто матом готов ругаться, а не помню что за фигня была. Что то вот в этих строчках исправил и все заработало.
CGPROGRAM
#pragma vertex vert
#pragma geometry geom
#pragma fragment frag
#include "UnityCG.cginc"
Пока проблему обошёл, не особо актуально, но надо будет порезать всё лишнее и сделать воспроизводящий проблему минимальный шейдер. Может тогда прояснится.
куда конкретно писать не понял но вроде заголовок данного раздела подходит к моей проблеме. Как все знают, кто компилирует apk для Google Play, то что Googl выкатил требование поддержки 10 андроида для своих приложений иначе обновления и новые приложения нельзя будет заливать на их ресурс.
А теперь немного чудес с Unity. Я тут же попытался обновить sdk, но не вышло, в итоге удалил Unity полностью и установил по новой, скачал sdk, ndk, jdk. Тут же проверил как все встало и проверил есть ли поддержка 10 андроида и да все получилось, скомпилировал все было хорошо.
И вот самое интересное.....
Примерно неделю не заходил в приложение и вот запустил, решил скомпилировать и выложить обновление, а там такая интересная информация в консоли о том что в приложении поддержка только до 9 андроида. Тут же проверил и правда поддержка 10 андроида пропала. Может кто сталкивался с этим? как исправить? Так как каждый раз переустанавливать Unity как то не охота да и не правильно это, должно быть какое то другое решение этой проблемы. Помогите кто может.
GamePrograms
> Googl выкатил требование поддержки 10 андроида
Это Target API Level?
GamePrograms
> Тут же проверил и правда поддержка 10 андроида пропала
Это где?
Все исправил сам.
Есть проблема по учетной записи юнити. Вчера сим карта приказала долго жить и теперь я не могу сменить номер телефона так как просит восстановление через телефон или просит какой то код. Какой я не могу понять, а восстановление через почту нету, хоть она и указана.
Тема в архиве.