Невозможно получить контроль над переменными openGL ES - PullRequest
0 голосов
/ 08 февраля 2019

Я использую следующий вершинный шейдер из учебника:

                "uniform mat4 matriceDessin;" +
                "uniform mat4 matriceVueCamera;" +
                "uniform vec3 positionLumiere;" +
                "attribute vec4 positionsSommets;" +
                "attribute vec3 vecteursNormaux;" +
                "attribute vec4 couleursSommets;" +

                "varying vec4 v_Color;" +

                "void main() {" +
                    "vec3 sommet,vecteurNormal,directionLumiere;"+
                    "float distance,diffuse;" +

                    "sommet = vec3(matriceVueCamera * positionsSommets);" +
                    "vecteurNormal = vec3(matriceVueCamera * vec4(vecteursNormaux, 0.0));" +
                    "distance = length(positionLumiere - sommet);" +
                    "directionLumiere = normalize(positionLumiere - sommet);" +
                    "diffuse = max(dot(vecteurNormal, directionLumiere), 0.1);" +
                    "diffuse = diffuse * (1.0 / (1.0 + (0.25 * distance * distance)));" +
                    "v_Color = couleursSommets;" +

                    "gl_Position = matriceDessin * positionsSommets;" +
                "}";

Для определения местоположения моих переменных я использую после успешного создания и связывания программы:

            GLES31.glUseProgram(programme);
            pointeurSurPosition = GLES31.glGetAttribLocation(programme, "positionsSommets");
            pointeurSurVecteurNormal = GLES31.glGetAttribLocation(programme, "vecteursNormaux");
            pointeurSurPositionLumière = GLES31.glGetUniformLocation(programme, "positionLumiere");
            pointeurSurMatriceDessin = GLES31.glGetUniformLocation(programme, "matriceDessin");
            pointeurSurMatriceVueCaméra = GLES31.glGetUniformLocation(programme, "matriceVueCamera");

Проблема, с которой я сталкиваюсь, состоит в том, что вызовы, сделанные для получения местоположений matriceVueCamera, positionLumiere и vecteursNormaux, всегда возвращают -1 (другие местоположения корректно извлекаются).

Согласноdoc, это может произойти, если переменные не являются активными, но можно заметить, что они используются в шейдере, поэтому их следует рассматривать как активные, по крайней мере, насколько я понимаю концепцию.

Я пыталсяпривязать местоположение к этим переменным с помощью glBindAttribLocation, прежде чем связывать программу, но это не помогло.

Кто-нибудь видит, где может быть моя проблема?

Я использую Open GL ES 3.1.

1 Ответ

0 голосов
/ 08 февраля 2019

Локальная переменная diffuse вычисляется, но никогда не используется в программе.Поскольку код шейдера оптимизируется драйвером, это приводит к тому, что весь код отбрасывается, что используется для вычисления diffuse.Поскольку для вычисления diffuse необходимы только унифицированные переменные matriceVueCamera, positionLumiere и vecteursNormaux, они не становятся активными программными ресурсами.Они не нужны для обработки программы.

Возможно, вы пропустили использование diffuse, когда вычисляется v_Color:

v_Color = couleursSommets * diffuse ;

См. OpenGL ES Shading Language 3.00 Спецификация- 2.12.6 Унифицированные переменные;стр. 58 :

7.6 Унифицированные переменные

Шейдеры могут объявлять именованные унифицированные переменные, как описано в Спецификации языка шейдинга OpenGL ES.Значения для этих униформ постоянны по сравнению с примитивом, и, как правило, они постоянны во многих примитивах.Униформа считается активной, если компилятором и компоновщиком определено, что к форме будет фактически получен доступ при выполнении исполняемого кода.В случаях, когда компилятор и компоновщик не могут сделать окончательное определение, униформа будет считаться активной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...