转义色键颜色
Escape chroma key color
我正在尝试使用 ARCore 的 Sceneform 框架来播放基于 chromakeyVideo 示例项目的视频。
创建模型时:
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;
});
代码设置要从渲染中删除的键颜色(在本例中为绿色),但我不想从我的渲染中删除任何颜色。
这是设置 属性:
的行
renderable.getMaterial().setFloat4("keyColor", CHROMA_KEY_COLOR);
如果我注释该行或将颜色替换为null,则删除的颜色为黑色。我不知道如何跳过这个过程,而且我找到的 setFloat4 文档不完整。
有什么想法吗?
创建一个只使用外部纹理的新自定义 material 可能比使色度键控可选更容易。您可以在名为 externalTexture.mat
:
的 sampledata/models 目录中创建一个新的 .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;
}
}
然后在您的 .sfa 文件中将 material 源更改为 externalTexture.mat:
source: "sampledata/models/externalTexture.mat",
我正在尝试使用 ARCore 的 Sceneform 框架来播放基于 chromakeyVideo 示例项目的视频。
创建模型时:
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;
});
代码设置要从渲染中删除的键颜色(在本例中为绿色),但我不想从我的渲染中删除任何颜色。 这是设置 属性:
的行renderable.getMaterial().setFloat4("keyColor", CHROMA_KEY_COLOR);
如果我注释该行或将颜色替换为null,则删除的颜色为黑色。我不知道如何跳过这个过程,而且我找到的 setFloat4 文档不完整。
有什么想法吗?
创建一个只使用外部纹理的新自定义 material 可能比使色度键控可选更容易。您可以在名为 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;
}
}
然后在您的 .sfa 文件中将 material 源更改为 externalTexture.mat:
source: "sampledata/models/externalTexture.mat",