Search code examples
androidarcore

Escape chroma key color


I'm trying to use the Sceneform framework from ARCore to play a video, based on the chromakeyVideo example project.

While creating the model:

 ModelRenderable.builder()
        .setSource(this, R.raw.chroma_key_video)
        .build()
        .thenAccept(
            renderable -> {
              videoRenderable = renderable;
              renderable.getMaterial().setExternalTexture("videoTexture", texture);
              renderable.getMaterial().setFloat4("keyColor", CHROMA_KEY_COLOR);
            })
        .exceptionally(
            throwable -> {
              Toast toast =
                  Toast.makeText(this, "Unable to load video renderable", Toast.LENGTH_LONG);
              toast.setGravity(Gravity.CENTER, 0, 0);
              toast.show();
              return null;
            });

The code sets the keycolor to delete from the rendering (green, in this case), but I don't want any color to be removed from my render. This is the line that sets that property:

renderable.getMaterial().setFloat4("keyColor", CHROMA_KEY_COLOR);

If I comment the line or replace the color with null, the color that is deleted is black. I don't see how to skip this process, and the documentation I found for the setFloat4 is incomplete.

Any ideas?


Solution

  • It is probably easier to create a new custom material that just uses the external texture vs. making the chromakeying optional. You can create a new .mat file in the sampledata/models directory named externalTexture.mat:

    // Copyright 2018 Google LLC. All Rights Reserved.
    //
    // Licensed under the Apache License, Version 2.0 (the "License");
    // you may not use this file except in compliance with the License.
    // You may obtain a copy of the License at
    //
    //      http://www.apache.org/licenses/LICENSE-2.0
    //
    // Unless required by applicable law or agreed to in writing, software
    // distributed under the License is distributed on an "AS IS" BASIS,
    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    // See the License for the specific language governing permissions and
    // limitations under the License.
    material {
        "name" : "Chroma Key Video Material",
        "defines" : [
            "baseColor"
        ],
        "parameters" : [
            {
               // The texture displaying the frames of the video.
               "type" : "samplerExternal",
               "name" : "videoTexture"
            }
        ],
        "requires" : [
            "position",
            "uv0"
        ],
        "shadingModel" : "unlit",
        // Blending is "masked" instead of "transparent" so that the shadows account for the
        // transparent regions of the video instead of just the shape of the mesh.
        "blending" : "masked",
        // Material is double sided so that the video is visible when walking behind it.
        "doubleSided" : true
    }
    
    fragment {
        void material(inout MaterialInputs material) {
            prepareMaterial(material);
    
            vec2 uv = getUV0();
    
            if (!gl_FrontFacing) {
              uv.x = 1.0 - uv.x;
            }
    
            material.baseColor = texture(materialParams_videoTexture, uv).rgba;
        }
    }
    

    Then in your .sfa file change the material source to externalTexture.mat:

         source: "sampledata/models/externalTexture.mat",