Как получить текстуру на плоскости в ARcore?

Я работал с демонстрационным кодом Arcore, предоставленным Google, и работал в Android Studio, я бы хотел избежать использования Unity, если смогу выполнить эту задачу.

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

Изображение по умолчанию, используемое самолетом, - это файл с именем trigrid.png, который определен в HelloArActivity.java.

https://github.com/google-ar/arcore-android-sdk/blob/master/samples/java_arcore_hello_ar/app/src/main/java/com/google/ar/core/examples/java/helloar/HelloArActivity.java

Я попытался заменить его файлом изображения, который представлял собой просто текстуру травы, и назвал его floor.png. Он просто выглядит белым и вообще не отображает траву.

        }
    try {
        mPlaneRenderer.createOnGlThread(/*context=*/this, "floor.png");
    } catch (IOException e) {
        Log.e(TAG, "Failed to read plane texture");
    }

Я пробовал добавить

            GLES20.glEnable(GLES20.GL_BLEND);

в функции drawPlanes, но это, похоже, не помогло. Я также прокомментировал некоторые изменения цветов в drawPlanes.

        //GLES20.glClearColor(1, 1, 1, 1);
    //GLES20.glColorMask(false, false, false, true);
    //GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
    //GLES20.glColorMask(true, true, true, true);

Я не уверен, что требуется для отображения текстуры. Это могло быть связано с файлами plane_fragment.shader, но у меня нет опыта работы с ними.

Любое понимание было бы полезно.


person bobsburgers129    schedule 31.10.2017    source источник


Ответы (1)


Шейдеры очень важны. Если вы хотите заниматься программированием графики в OpenGL, вам нужно хотя бы немного знать о шейдерах. Это программы, которые запускаются на графическом процессоре (ГП) для определения цвета каждого пикселя для каждого кадра. Краткое введение в шейдеры можно найти здесь: https://youtu.be/AyNZG_mqGVE.

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

Конкретно:

  1. Создайте новый файл с именем plane_simple_fragment.shader в каталоге src/main/assets/raw.

  2. Откройте его в редакторе и добавьте следующий код:

    uniform sampler2D u_Texture;
    varying vec3 v_TexCoordAlpha;
    
    void main() {
      gl_FragColor = texture2D(u_Texture, v_TexCoordAlpha.xy);
    }
    
  3. Затем в PlaneRenderer перейдите на новый шейдер, заменив R.raw.plane_fragment на R.raw.plane_simple_fragment.

person Clayton Wilkinson    schedule 03.11.2017
comment
Это сработало! Спасибо, что нашли время помочь мне с этим. Этот новый шейдер заставил текстуры появиться. - person bobsburgers129; 06.11.2017
comment
Спасибо! Теперь, что мне нужно изменить в PlaneRenderer 1) чтобы увидеть только одно появление этой текстуры 2) определить ее размер 3) определить ее положение на плоскости? Спасибо ! - person Regis_AG; 12.02.2018