Small fixes to decor rendering.
Use an unlit material for decorative elements and do not render them in the reflection pass. PiperOrigin-RevId: 899560291 Change-Id: I3b035d556432c850ce8240e0c4c4c2d6645d7bf2
This commit is contained in:
committed by
Copybara-Service
parent
72cb2b210d
commit
08bb6e66f1
@@ -114,6 +114,7 @@ set(MATERIAL_FILES
|
|||||||
phong_cube_fade.mat
|
phong_cube_fade.mat
|
||||||
phong_cube.mat
|
phong_cube.mat
|
||||||
phong_cube_reflect.mat
|
phong_cube_reflect.mat
|
||||||
|
unlit_decor.mat
|
||||||
unlit_depth.mat
|
unlit_depth.mat
|
||||||
unlit_line.mat
|
unlit_line.mat
|
||||||
unlit_segmentation.mat
|
unlit_segmentation.mat
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
// Copyright 2025 DeepMind Technologies Limited
|
||||||
|
//
|
||||||
|
// 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 : unlit_decor,
|
||||||
|
shadingModel : unlit,
|
||||||
|
culling: none,
|
||||||
|
parameters : [
|
||||||
|
{ type : float4, name : BaseColorFactor }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
fragment {
|
||||||
|
void material(inout MaterialInputs material) {
|
||||||
|
prepareMaterial(material);
|
||||||
|
material.baseColor = materialParams.BaseColorFactor;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -84,6 +84,7 @@ ObjectManager::ObjectManager(filament::Engine* engine)
|
|||||||
materials_[kPhongCubeReflect] = LoadMaterial("phong_cube_reflect.filamat");
|
materials_[kPhongCubeReflect] = LoadMaterial("phong_cube_reflect.filamat");
|
||||||
materials_[kUnlitSegmentation] = LoadMaterial("unlit_segmentation.filamat");
|
materials_[kUnlitSegmentation] = LoadMaterial("unlit_segmentation.filamat");
|
||||||
materials_[kUnlitLine] = LoadMaterial("unlit_line.filamat");
|
materials_[kUnlitLine] = LoadMaterial("unlit_line.filamat");
|
||||||
|
materials_[kUnlitDecor] = LoadMaterial("unlit_decor.filamat");
|
||||||
materials_[kUnlitDepth] = LoadMaterial("unlit_depth.filamat");
|
materials_[kUnlitDepth] = LoadMaterial("unlit_depth.filamat");
|
||||||
materials_[kUnlitUi] = LoadMaterial("unlit_ui.filamat");
|
materials_[kUnlitUi] = LoadMaterial("unlit_ui.filamat");
|
||||||
|
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ class ObjectManager {
|
|||||||
kPhongCubeFade,
|
kPhongCubeFade,
|
||||||
kPhongCubeReflect,
|
kPhongCubeReflect,
|
||||||
kUnlitSegmentation,
|
kUnlitSegmentation,
|
||||||
|
kUnlitDecor,
|
||||||
kUnlitDepth,
|
kUnlitDepth,
|
||||||
kUnlitLine,
|
kUnlitLine,
|
||||||
kUnlitUi,
|
kUnlitUi,
|
||||||
|
|||||||
@@ -183,7 +183,8 @@ void Renderable::SetMaterialInstance(filament::MaterialInstance* instance) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderable::SetLayerMask(std::uint8_t mask) {
|
std::uint8_t Renderable::SetLayerMask(std::uint8_t mask) {
|
||||||
|
std::uint8_t prev = layer_mask_;
|
||||||
if (mask != layer_mask_) {
|
if (mask != layer_mask_) {
|
||||||
layer_mask_ = mask;
|
layer_mask_ = mask;
|
||||||
|
|
||||||
@@ -192,9 +193,11 @@ void Renderable::SetLayerMask(std::uint8_t mask) {
|
|||||||
rm.setLayerMask(rm.getInstance(entity), 0xff, layer_mask_);
|
rm.setLayerMask(rm.getInstance(entity), 0xff, layer_mask_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return prev;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderable::SetPriority(std::uint8_t priority) {
|
std::uint8_t Renderable::SetPriority(std::uint8_t priority) {
|
||||||
|
std::uint8_t prev = priority_;
|
||||||
if (priority != priority_) {
|
if (priority != priority_) {
|
||||||
priority_ = priority;
|
priority_ = priority;
|
||||||
|
|
||||||
@@ -203,6 +206,7 @@ void Renderable::SetPriority(std::uint8_t priority) {
|
|||||||
rm.setPriority(rm.getInstance(entity), priority_);
|
rm.setPriority(rm.getInstance(entity), priority_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return prev;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderable::SetCastShadows(bool cast_shadows) {
|
void Renderable::SetCastShadows(bool cast_shadows) {
|
||||||
|
|||||||
@@ -57,10 +57,10 @@ class Renderable {
|
|||||||
int GetNumEntities() const { return entities_.size(); }
|
int GetNumEntities() const { return entities_.size(); }
|
||||||
|
|
||||||
// Hides all managed entities.
|
// Hides all managed entities.
|
||||||
void SetLayerMask(std::uint8_t mask);
|
std::uint8_t SetLayerMask(std::uint8_t mask);
|
||||||
|
|
||||||
// Sets the priority of all managed entities.
|
// Sets the priority of all managed entities.
|
||||||
void SetPriority(std::uint8_t priority);
|
std::uint8_t SetPriority(std::uint8_t priority);
|
||||||
|
|
||||||
// Disables the renderables from casting shadows.
|
// Disables the renderables from casting shadows.
|
||||||
void SetCastShadows(bool cast_shadows);
|
void SetCastShadows(bool cast_shadows);
|
||||||
|
|||||||
@@ -206,6 +206,7 @@ static void SetGeomTransform(Renderable& renderable, const mjvGeom& geom) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
mat4 transform = mat4(ReadMat3(geom.mat), ReadFloat3(geom.pos));
|
mat4 transform = mat4(ReadMat3(geom.mat), ReadFloat3(geom.pos));
|
||||||
|
renderable.SetLayerMask(geom.category);
|
||||||
|
|
||||||
float3 size = ReadFloat3(geom.size);
|
float3 size = ReadFloat3(geom.size);
|
||||||
filament::TransformManager& tm =
|
filament::TransformManager& tm =
|
||||||
@@ -362,6 +363,8 @@ static void UpdateGeomMaterial(Renderable& renderable, const mjvGeom& geom,
|
|||||||
ObjectManager::MaterialType material_type = ObjectManager::kNumMaterials;
|
ObjectManager::MaterialType material_type = ObjectManager::kNumMaterials;
|
||||||
if (geom.type == mjGEOM_LINE || geom.type == mjGEOM_LINEBOX) {
|
if (geom.type == mjGEOM_LINE || geom.type == mjGEOM_LINEBOX) {
|
||||||
material_type = ObjectManager::kUnlitLine;
|
material_type = ObjectManager::kUnlitLine;
|
||||||
|
} else if (geom.category == mjCAT_DECOR) {
|
||||||
|
material_type = ObjectManager::kUnlitSegmentation;
|
||||||
} else {
|
} else {
|
||||||
bool material_assigned = false;
|
bool material_assigned = false;
|
||||||
if (geom.matid >= 0) {
|
if (geom.matid >= 0) {
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
#include <cstdint>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
#include <filament/ColorGrading.h>
|
#include <filament/ColorGrading.h>
|
||||||
@@ -135,6 +136,7 @@ SceneView::SceneView(filament::Engine* engine) : engine_(engine) {
|
|||||||
view = engine->createView();
|
view = engine->createView();
|
||||||
view->setScene(scene_);
|
view->setScene(scene_);
|
||||||
view->setCamera(camera_);
|
view->setCamera(camera_);
|
||||||
|
view->setVisibleLayers(0xff, mjCAT_ALL);
|
||||||
}
|
}
|
||||||
|
|
||||||
reflect_view_ = engine->createView();
|
reflect_view_ = engine->createView();
|
||||||
@@ -142,6 +144,7 @@ SceneView::SceneView(filament::Engine* engine) : engine_(engine) {
|
|||||||
reflect_view_->setCamera(reflect_camera_);
|
reflect_view_->setCamera(reflect_camera_);
|
||||||
reflect_view_->setShadowingEnabled(false);
|
reflect_view_->setShadowingEnabled(false);
|
||||||
reflect_view_->setPostProcessingEnabled(false);
|
reflect_view_->setPostProcessingEnabled(false);
|
||||||
|
reflect_view_->setVisibleLayers(0xff, mjCAT_DYNAMIC | mjCAT_STATIC);
|
||||||
|
|
||||||
// Disable post processing for the depth and segmentation views to preserve
|
// Disable post processing for the depth and segmentation views to preserve
|
||||||
// the values.
|
// the values.
|
||||||
@@ -260,7 +263,7 @@ void SceneView::Render(filament::Renderer* renderer,
|
|||||||
SetupReflectionCamera(transform, camera_, reflect_camera_);
|
SetupReflectionCamera(transform, camera_, reflect_camera_);
|
||||||
|
|
||||||
// Hide reflective surface from its own reflection pass.
|
// Hide reflective surface from its own reflection pass.
|
||||||
renderable->SetLayerMask(0x00);
|
std::uint8_t previous_layer_mask = renderable->SetLayerMask(0x00);
|
||||||
|
|
||||||
// Render the reflection to its render target.
|
// Render the reflection to its render target.
|
||||||
reflect_view_->setRenderTarget(
|
reflect_view_->setRenderTarget(
|
||||||
@@ -268,7 +271,7 @@ void SceneView::Render(filament::Renderer* renderer,
|
|||||||
renderer->render(reflect_view_);
|
renderer->render(reflect_view_);
|
||||||
|
|
||||||
// Unhide the reflective surface.
|
// Unhide the reflective surface.
|
||||||
renderable->SetLayerMask(0x01);
|
renderable->SetLayerMask(previous_layer_mask);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user