如何在ARcore中的平面上显示纹理?

时间:2017-10-31 22:12:23

标签: android opengl-es arcore

我一直在使用Google提供的Arcore演示代码并且在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 个答案:

答案 0 :(得分: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,更改为新着色器。