Как заставить текстуру появляться на плоскости в 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, но я не имею никакого опыта с ними.

Любое понимание будет полезно.

1 ответ

Шейдеры очень важны. Если вы хотите заниматься графическим программированием в OpenGL, вам нужно хотя бы немного знать о шейдерах. Это программы, которые работают на графическом процессоре (GPU) для определения цвета каждого пикселя для каждого кадра. Я быстро знакомлюсь с шейдерами здесь: 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,

Другие вопросы по тегам