GLSL vars проблема преобразования из ShaderToy в Android Studio GLSL - PullRequest
0 голосов
/ 03 декабря 2018

Я хотел бы получить очень простое объяснение, ПОЧЕМУ эти переменные не работают в «Android Studio» и как решить мою проблему (некоторые работают над « TheeBookOfShaders », некоторые работают над «* 1003»* Atom", другие работают на обоих, некоторые работают только на" ShaderToy", а некоторые работают только на" Android Studio").


* Чтобы действительно понять, это образец (из файла "фрагмент.glsl") *

uniform vec2 resolution;     // [-] work on...
uniform vec2 uresolution;    // [-] work on...
uniform vec2 iresolution;    // [Y] work only on "ShaderToy"
uniform vec2 u_resolution;   // [Y] work on "Atom" and "WebGL"

т.е. * Пример преобразования из "ShaderToy"TO "Атом" (живое кодирование) *

uniform vec2 iresolution;    // is used on: "ShaderToy"
uniform vec2 u_resolution;   // is used on: "Atom", "WebGL", etc.

так: [ iresolution = u_resolution ] * OK Работает *


* Ну, а теперь, почему в «Android Studio» (java code + фрагмент.glsl) ни один из них не работает?*

   uniform vec2 resolution;     // doesn't work on "Android Studio"
   uniform vec2 uresolution;    // doesn't work on "Android Studio"
   uniform vec2 iresolution;    // doesn't work on "Android Studio"
   uniform vec2 u_resolution;   // doesn't work on "Android Studio"
   uniform vec2 vresolution;    // doesn't work on "Android Studio"
   uniform vec2 v_resolution;   // doesn't work on "Android Studio"

и, очевидно:

   vec2 A = (gl_FragCoord.xy / u_resolution);     // doesn't work on "Android Studio"
   vec2 A = (gl_FragCoord.xy / uresolution);      // doesn't work on "Android Studio"
   vec2 A = (gl_FragCoord.xy / *SOME*resolution); // doesn't work on "Android Studio"

и т. Д.


Та же ситуация с time var: время, время, время, время, время, время, время, глобальное время, и т. Д.


* Где найти точное ключевое слово для использования РАЗРЕШЕНИЕ / ВРЕМЯ/ other s системная переменная в файле шейдера GLSL "Android Studio"?*

  • "разрешение" Существует ли в настоящее время определенная справочная таблица, чтобы понять, как преобразовать системные переменные?

  • "разрешение"это системная библиотека или нет?

  • "Xresolution" Есть ли простая окончательная реальная схема, чтобы понять что-то в этой путанице?


, в этом примере мы видим ТОЛЬКО рабочую версию Xresolution - попробуйте дома

в этом другом примере, мы можем увидеть ВСЕ ДРУГИЕ версии Xresolution с желтым отказом - попробуйте дома


Тестовый файл "gment.glsl "работает на 100% на Atom-Editor (попробуйте на дому, пожалуйста)

#ifdef GL_ES
    precision highp float;
#endif

uniform vec2 resolution;    // not-system var
uniform vec2 uresolution;   // not-system var
uniform vec2 iResolution;   // system-var WORK 100% on ShaderToy
uniform vec2 vresolution;   // not-system var
uniform vec2 u_resolution;  // system-var WORK 100% on Atom-Editor but NOT on Android Studio
uniform vec2 i_resolution;  // not-system var
uniform vec2 v_resolution;  // not-system var

void main()
{
    vec2 A = (gl_FragCoord.xy / u_resolution);

    gl_FragColor = vec4(A.x, A.y, 0.0, 1.0);
}

* РЕШЕНИЕ |РАБОТАЙТЕ 100% ТОЛЬКО НА СТУДИИ ANDROID *

#ifdef GL_ES
    precision highp float;
#endif

uniform vec2 u_resolution; // note: you can name it also "Pacman"...
                           // this mode let you can to create your
                           // personal var-name to access to windows view-port

void main()
{
    // ---------------------------------------------------------------------------------
    u_resolution = vec2(1920, 1080); // this assignment work 100% ONLY on Android Studio
    // ---------------------------------------------------------------------------------

    // --------------------------------------------------------------------------
    vec2 A = (gl_FragCoord.xy / u_resolution);                      // solution 1
    vec2 A = (gl_FragCoord.xy / vec2(1920, 1080));                  // solution 2
    vec2 A = (vec2(gl_FragCoord.x / 1920, gl_FragCoord.y / 1080));  // solution 3
    // --------------------------------------------------------------------------

    gl_FragColor = vec4(A.x, A.y, 0.0, 1.0);
}

Наконец мы нашли решение, всегда перед нашими глазами.Мы начинаем с окна, в котором размеры X и Y установлены равными 1920x1080 (в нашем случае нам больше ничего не нужно), и я указываю на 3 режима установки переменной " u_resolution ". ПРЕДУПРЕЖДЕНИЕ - эта функция работает ТОЛЬКО в Android Studio и может ответить на мои вопросы выше.Проблема была решена.Фелипе показал свою приверженность решению проблемы путем участия.Конечно, мы также можем установить это значение из основного кода через Java, C ++ или другие;но нам, в этом посте, было только интересно установить / получить эти " u_resolution " напрямую через / из GLSL .


Принятое решениеотлично отвечает потребностям отправления, и я надеюсь, что это будет полезно всем тем, кто придет за мной. Решение в три строки эквивалентно: выберите предпочитаемое


Отдельное спасибо @ felipe-gutierrez за любезное сотрудничество.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

НЕТ из упомянутых вами переменных GLSL являются системными переменными

Это переменные, созданные пользователем.

uniform vec2 resolution;

не имеет абсолютно никакого значения, чем;

uniform vec2 foobar;

Это переменные, выбранные you .

Вы устанавливаете их, просматривая их местоположение

В WebGL / JavaScript

const resolutionLocation = gl.getUniformLocation(someProgram, "resolution");
const foobarLocation = gl.getUniformLocation(someProgram, "foobar");

В Java

int resolutionLocation = GLES20.glGetUniformLocation(mProgram, "resolution");
int foobarLocation = GLES20.glGetUniformLocation(mProgram, "foobar");

Вы устанавливаете их в WebGL / JavaScript

gl.useProgram(someProgram);  
gl.uniform2f(resolutionLocation, yourVariableForResolutionX, yourVariableForResolutionY);
gl.uniform2f(foobarLocation, yourVariableForFoobarX, yourVariableForFoobarY);

или Java

GLES20.glUseProgram(someProgram);  
GLES20.glUniform2f(resolutionLocation, yourVariableForResolutionX, yourVariableForResolutionY);
GLES20.glUniform2f(foobarLocation, yourVariableForFoobarX, yourVariableForFoobarY);

Нет магических системных переменных, они100% переменные вашего приложения.iResolution - это переменная, которую составили программисты ShaderToy.u_resolution - это переменная, созданная автором плагина для Atom.Они могли так же легко выбрать renderSize или gamenHirosa (японский для ширины экрана), или что-нибудь еще.Опять же, они не системные переменные, это переменные, выбранные программистом.В вашем приложении вы также создаете свои собственные переменные.

Я предлагаю вам прочитать некоторые учебники по WebGL

0 голосов
/ 04 декабря 2018

Согласно сайту Khronos: "Униформа - это глобальная переменная GLSLvariable, объявленная с помощью спецификатора хранения" Uniform ". Они действуют как параметры, которые пользователь шейдерной программы может передать этой программе. Они хранятся вПрограммный объект. Униформы названы так, потому что они не переходят от одного выполнения программы шейдера к следующему в рамках конкретного вызова рендеринга, что делает их отличными от входных и выходных данных этапа шейдера, которые часто различаются для каждого вызова этапа программы." Другими словами, это переменная, которую вы создаете на своем хосте, к которой вы можете обращаться в своей программе OpenGL (Vertex и Fragment Shaders), но которую вы не можете изменять напрямую, например, вы получаете разрешение вашего окна.в Java, C ++, Javascript или ***, вы вводите его в соглашении Shadertoy как iResolution или в качестве позиции мыши и щелчка левой кнопкой мыши (iMouse.xyz) и передаете его как Uniform в ваш фрагментный шейдер.Они полезны для ввода, который не слишком тяжелый, как вы, возможно, видели в Shadertoy, видео размещаются в виде текстур, таких как ваша веб-камера или клип Ван Даммеса, вы даже можете передавать звук в качестве входных данных, для более сложных эффектов вы можете передаватьодна шейдерная программа в другую для таких вещей, как аддитивное смешивание или пинг-понг как BufferA, или B, или C, или D в Shadertoy.

Вы можете увидеть, что они обозначают от входов до шейдера в верхней частиредактор на сайте shadertoy, Shadertoy Inputs и здесь вы можете проверить, как я получил много тех же самых входных данных, которые использует shadertoy в C ++ и, к сожалению, не простой Java, но Processing

Если вы хотите проверить правильность формы iResolution, введите:

void main()
{

    vec2 uv = gl_FragCoord.xy/u_resolution;

    vec3 col = vec3( smoothstep( 0.1, 0.1 - 0.005, length( uv - 0.5 ) ) );

    gl_FragColor = vec4( col, 1 );

}

И вы должны увидеть эллипс в центре экрана.Proper Input

...