XGRIDSDokumentation
  • 简体中文
  • English
  • 繁體中文
  • 日本語
  • Deutsch
  • Español
  • Italiano
  • Français
  • Русский
  • Polski
  • Nederlands
  • 简体中文
  • English
  • 繁體中文
  • 日本語
  • Deutsch
  • Español
  • Italiano
  • Français
  • Русский
  • Polski
  • Nederlands
  • Lixel PortalCam-Serie

    • PortalCam P1

      • Produktübersicht
      • Grundlegende Bedienung
      • LCC Scan App verwenden
      • Wartung und Pflege
      • FAQ
  • Lixel K-Serie

    • Lixel K1

      • Produktübersicht
      • Grundlegende Bedienung
      • Geräteaktivierung und -verbindung
      • Scan-Workflow
      • Punktwolke mit absoluten Koordinaten erfassen
      • Kartenfusion
      • Empfehlungen zur Routenplanung für typische Szenen
      • Hinweise
      • FAQ
    • Lixel K2

      • Produktübersicht
      • Grundlegende Bedienung
      • Aktivierung und Verbindung
      • Scan-Workflow
      • Punktwolke mit absoluten Koordinaten erfassen
      • Kartenfusion
      • Empfehlungen zur Routenplanung für typische Szenen
      • Hinweise
      • FAQ
  • Lixel L-Serie

    • Lixel L2 Pro

      • Produktübersicht
      • Grundlegende Bedienung
      • Geräteaktivierung und -verbindung
      • Scan-Workflow
      • Punktwolke mit absoluten Koordinaten erfassen
      • Messpunkt
      • Anhang
      • FAQ
    • Lixel L3

      • Produktübersicht
      • Grundlegende Bedienung
      • Aktivierung und Verbindung
      • Scan-Workflow
      • Punktwolke mit absoluten Koordinaten erfassen
      • Anhang
  • Zubehör

    • Stick Light

      • Installationsanleitung
      • Grundlegende Bedienung
      • Häufige Fragen
  • Lixel Studio

    • Version und Copyright
    • Installation und Aktivierung
    • Softwareoberfläche
    • Dateioperationen
    • Projektverarbeitung
    • Werkzeuge
    • 2D-Zeichnung
    • Anwendungen
    • Einstellungen
    • Geräteverbindung
    • Häufige Fragen
  • Lixel CyberColor

    • LCC Studio

      • Erste Schritte
      • Version und Updates
      • Download und Installation
      • Oberfläche und Navigation
      • Vor der Rekonstruktion
      • Modellrekonstruktion
      • Einzelmodell-Rekonstruktion
      • Kartenfusion
      • Boden-Luft-Fusion
      • Luftbild-Rekonstruktion
      • Meine Modelle
      • Weitere Funktionen
      • Einstellungen und Konto
      • Converter
      • Videorekonstruktion
      • Häufige Fragen / FAQ
    • LCC Scene Editor

      • Version und Updates
      • Konto und Anmeldung
      • Produktübersicht und Startseite
      • Editor-Oberfläche
      • Navigationsmodi
      • Datei
      • Einstellungen
      • Bearbeiten
      • Fenster
      • Globale Symbolleiste
      • Assets und Eigenschaften
      • Linke Symbolleiste
      • Ansichtspunkte
      • Portal
      • Skybox
      • Markierungen
      • Messung
      • Flythrough
      • Szenenbericht
      • 3D-Layout
      • Minikarte
      • Vorschaumodus (Viewer)
      • Hilfe
      • Häufige Fragen (FAQ)
      • Spawn-Point
    • LCC Model Editor

      • Version und Updates
      • Benutzerhandbuch
      • Übersicht und Oberfläche
      • Dateioperationen
      • Selektoren
      • Modelle bearbeiten
      • Messung
      • Farbkorrektur
      • Asset-Verwaltung
      • Einstellungen und Hilfe
      • Häufige Fragen
    • Capture Guide

      • Überblick
      • Überblick über die Aufnahmegeräte
      • Allgemeine Aufnahmeprinzipien
      • Aufnahme von Innenszenen
      • Aufnahme von Außenszenen
      • Großflächige Aufnahme (Map Fusion)
      • Aerial-Ground Map Fusion – Aufnahme
      • Objektaufnahme
      • Personenaufnahme
      • Video-Rekonstruktionsaufnahme
      • HD Enhancement
      • Kontrollpunkte (Lixel P1)
      • FAQ und Fehlerbehebung
    • Best Practices

      • Zusammenführen mehrerer großer 3DGS-Modelle
    • Versionsgeschichte
  • Plugin & SDK

    • Unreal

      • Einführung
      • Schnellstart - Windows
      • Schnellstart - Linux
      • Schnellstart - Quest3
      • Editionen und Lizenzierung
      • Rendering
      • Tiled-Rasterisierung (experimentell)
      • Bildeinstellungen
      • Normalen und Beleuchtung
      • Szenenbearbeitung
      • Leistungsparameter
      • Leitfaden zur Leistung
      • Integration von Drittanbieter- und Engine-Plugins
      • Proxy Mesh
      • Ladeanimation
      • Kollision
      • Unterstützung des Navigation System
      • Unterstützung von Single Layer Water
      • Lokalisierung
      • FAQ
      • Fehlerbehebung
      • Logs und Diagnose
      • Kontakt
      • Bewährte Vorgehensweisen

        • 3DGS mit einem LixelStudio-Mesh neu beleuchten
      • API-Referenz

        • ALCCActorBase
        • ULCCComponentBase
        • ULCCComponent
        • ULCC2Component
        • SOG- / SPZ- / PLY-Actors
        • ALCC2ProxyMesh
        • ALCCClippingVolume
        • ALCCSectionPlane
        • ALCCLoadVolume
        • ULCCUtilLibrary
        • Enums
        • Structs
      • Änderungsprotokoll

        • v3.4.0
        • v3.3.1
        • v3.0.0
        • v2.2.1
        • v1.0.0
        • v0.9.0
        • v0.8.0
        • v0.7.1
        • v0.6.1
        • v0.5.2
        • v0.4.1
        • v0.4.0
        • v0.3.0
        • v0.0.5
        • v0.0.4
        • v0.0.3
        • v0.0.2
        • v0.0.1
    • Unity

      • Einführung in das Unity SDK
      • Technische Funktionen
      • Anforderungen an die Entwicklungsumgebung
      • PC-Schnellstartanleitung
      • Leitfaden zur Optimierung der Projekteinstellungen
      • Pico 4 Ultra-Entwicklungsanleitung
      • Pico 4 Ultra-PC-Streaming-Anleitung
      • Quest 3-Entwicklungsanleitung
      • Quest 3-PC-Streaming-Anleitung
      • OpenXR-Entwicklungsanleitung
      • Pico 4 Ultra-Business-Streaming-Anleitung
      • Glossar
      • FAQ
      • Kontakt
      • Funktionsentwicklungsleitfaden

        • Entwicklungsanleitung für gemischtes Multi-Szenen-Rendering
        • Entwicklungsanleitung für Schattenempfang
        • Entwicklungsanleitung für Echtzeitbeleuchtung
        • Entwicklungsanleitung für Multi-Kamera-Rendering
        • Entwicklungsanleitung für hochauflösendes Bild-Rendering
        • Entwicklungsanleitung zur Kompatibilität der Datenformate LCC und LCC2
        • Entwicklungsanleitung für Ladeeffekte
        • Entwicklungsanleitung für das Umschalten des Mip-Rendering-Modus
        • Entwicklungsanleitung für Kanten- und Eckensnapping
        • Entwicklungsanleitung für projizierte Decals
        • Entwicklungsanleitung für projizierte Video-Decals
        • Entwicklungsanleitung für Hervorhebung
        • Entwicklungsanleitung für Echtzeit-Clipping
        • Entwicklungsanleitung für Farbanpassung
        • Entwicklungsanleitung für das Abrufen von Szenen-Mesh-Daten
        • Entwicklungsanleitung für den Editor-Modus
        • Konfigurationsanleitung für Render-Leistungsparameter
        • Entwicklungsanleitung zum gemeinsamen Paketieren von Anwendung und Daten
        • Entwicklungsanleitung für das Kollisionssystem
        • Anleitung zu macOS-Berechtigungsproblemen in der Entwicklung
        • Entwicklungsanleitung für Kompilierung und Paketierung auf iOS-Geräten
      • API-Referenz

        • LCCManager
        • Renderer
        • Datentypen
      • Changelog

        • v2.3.0
        • v2.2.10
        • v2.2.0
        • v2.1.19
        • v2.0.14
    • Web

      • Einführung
      • Leitfaden zur Rendering-Leistungsoptimierung
      • Grafikkonfiguration
      • Häufige Fragen
      • API-Referenz

        • LCCRender::clearIndexDB
        • LCCRender::dispose
        • LCCRender::load
        • LCCRender::setCamera
        • LCCRender::unload
        • LCCRender::update
        • LCCObject::checkRenderNextFrame
        • LCCObject::clearRenderNextFrame
        • LCCObject::ecef2Prj
        • LCCObject::getBounds
        • LCCObject::getEnvInstancedMesh
        • LCCObject::getInstancedMesh
        • LCCObject::getLodInfos
        • LCCObject::getOriginPosition
        • LCCObject::getProjectionCoordinateSystemInfos
        • LCCObject::hasCollision
        • LCCObject::hasEnvironment
        • LCCObject::hasShcoef
        • LCCObject::intersectsCapsule
        • LCCObject::intersectsRayExt
        • LCCObject::intersectsRayFromOriginExt
        • LCCObject::intersectsSphere
        • LCCObject::lowerToBottom
        • LCCObject::prj2Ecef
        • LCCObject::raiseToTop
        • LCCObject::raycast
        • LCCObject::raycastFromOrigin
        • LCCObject::setAlpha
        • LCCObject::setClipBox
        • LCCObject::setClipPlane
        • LCCObject::setEndLod
        • LCCObject::setLodAutoLevelUp
        • LCCObject::setMaxDistance
        • LCCObject::setMaxNodeSplats
        • LCCObject::setMaxSplats
        • LCCObject::setOriginPosition
        • LCCObject::setPointsColor
        • LCCObject::setRenderState
        • LCCObject::setRotation
        • LCCObject::setScale
        • LCCObject::setSemantic
        • LCCObject::setSemanticColor
        • LCCObject::setSmooth
        • LCCObject::setStartLod
        • LCCObject::setTranslation
        • LCCObject::setVisible
        • LCCObject::togglePointsDisplayMode
        • LCCObject::useEnvironment
        • LCCObject::useShcoef
      • Änderungsprotokoll

        • v0.6.3
        • v0.6.2
        • v0.6.1
        • v0.6.0
        • v0.5.5
        • v0.5.4
        • v0.5.3
        • v0.5.2
        • v0.5.1
        • v0.5.0
        • v0.4.1
        • v0.4.0
        • v0.3.1
        • v0.3.0
        • v0.2.0

Entwicklungsanleitung für Farbanpassung

Das LCC Unity SDK unterstützt Bearbeitungsoperationen wie Hervorhebung, Clipping und Farbanpassung auf 3DGS-Szenen. Diese Anleitung stellt Farbanpassungsoperationen vor: das Auswählen eines Bereichs über 2D-projizierte Texturen, 3D-Geometrie oder eine Mischung aus beidem und das Anpassen von Helligkeit, Sättigung und Kontrast des ausgewählten Bereichs, wobei normale Auswahl und invertierte Auswahl unterstützt werden.

Hinweis:

Die aktuelle Farbanpassungsfunktion ist nur ein Laufzeit-Anzeigeeffekt; sie verändert die ursprüngliche Datendatei in keiner Weise und unterstützt weder das Speichern noch das Exportieren des Bearbeitungsergebnisses. Wenn Sie Daten farbanpassen, zuschneiden und speichern müssen, verwenden Sie das Software-Tool XGRIDS LCC Editor.

Wenn Sie die Daten nicht verändern möchten, können Sie die Operationen auch aufzeichnen und sie (die Einstellungen ausführen) nach dem nächsten Abschluss des Datenladens erneut abspielen.

Voraussetzungen

Das Farbanpassen einer Szene über das SDK erfordert folgende Bedingungen:

  1. Vor dem Laden der Daten in den Bearbeitungszustand wechseln. Das SDK befindet sich standardmäßig im Durchsuchen-Zustand (View), der die beste Leistung bietet und für das normale Durchsuchen empfohlen wird. Um Bearbeitungsoperationen wie Farbanpassung auszuführen, wechseln Sie vor dem Aufruf von Load über SetEditorMode(true) in den Bearbeitungszustand. Diese Methode wirkt nur, wenn sie vor dem Laden aller Daten aufgerufen wird.
  2. Die Farbanpassungsoperation nach Abschluss des Datenladens ausführen. Die Farbanpassungsschnittstelle muss aufgerufen werden, nachdem die Szenendaten vollständig geladen sind.

Schritt 1: Die Szene einrichten

Bereiten Sie die für die Farbanpassung benötigten GameObjects in der Szene vor:

  • Hauptkamera: die Szenenkamera; die 2D-Farbanpassung verwendet ihre View- und Projektionsmatrizen.
  • LCCManager: ein leeres GameObject mit normalisierter Transform und dem hinzugefügten Skript LCCManager.
  • LCCRenderer: ein leeres GameObject mit Transform Rotation.x = -90, Scale.x = -1 (am LCC-Daten-Koordinatensystem ausgerichtet), zum Anhängen des später geschriebenen Skripts Tone.
  • 3D-Auswahlgeometrie (optional): Hilfsobjekte für die 3D-Farbanpassung. Das Beispiel bereitet einen Würfel (Box1) vor; das Verschieben und Skalieren steuert Position und Größe der 3D-Farbanpassungsauswahl.

Hinweis:

Für Einstellungen im Zusammenhang mit den GameObjects Rendering-Kamera, LCCManager und LCCRenderer siehe die relevanten Abschnitte der PC-Schnellstartanleitung und des Leitfadens zur Optimierung der Projekteinstellungen.

Schritt 2: Die Datenstruktur verstehen

Die Farbanpassung verwendet die Datenstruktur ToneMix, die gleichzeitig eine 2D-Texturauswahl und eine 3D-Geometrieauswahl beschreiben kann und die Farbanpassungsparameter trägt. Die verwendeten Enums und Structs sind wie folgt.

public enum SelectMode    { normal, invert, clip }  // normale Auswahl, invertieren, Echtzeit-Clipping
public enum OperationMode { normal, erase }         // normale Auswahl, Auswahl löschen
public enum ShapeType     { box, sphere }           // 3D-Box-Auswahl, 3D-Kugel-Auswahl
public enum EditType      { Edit2D, Edit3D }        // 2D-Bearbeitung, 3D-Bearbeitung

// Farbanpassungs-Auswahl
public struct ToneMix
{
    public EditType editType;       // Bearbeitungstyp (erforderlich; bestimmt, ob 2D- oder 3D-Felder verwendet werden)
    public Texture2D texture;       // 2D-Maskentextur (von Edit2D verwendet)
    public Matrix4x4 mv;            // Kamera-View-Matrix (von Edit2D verwendet)
    public Matrix4x4 mvp;           // Kamera-View-Projection-Matrix (von Edit2D verwendet)
    public ShapeType type;          // Geometrietyp (von Edit3D verwendet)
    public Matrix4x4 invMat;        // Geometrie-Inversmatrix (von Edit3D verwendet)
    public OperationMode operation; // Operationstyp (von Edit3D verwendet)
    public SelectMode mode;         // Auswahlmodus (erforderlich)

    public float brightness;        // Helligkeit, Bereich [0, 3], Standard 1.0
    public float saturation;        // Sättigung, Bereich [0, 3], Standard 1.0
    public float contrast;          // Kontrast, Bereich [0, 3], Standard 1.0
    public int lutid;               // LUT-Tabellenindex (reserviert), 0 bedeutet nicht verwendet
}

Zur Farbanpassungsliste gibt es drei Punkte zu beachten:

  1. Die Liste ist geordnet. Ob 2D oder 3D, Einträge in der Liste wirken in Reihenfolge; stellen Sie sicher, dass die Reihenfolge des Hinzufügens Ihrer Erwartung entspricht.
  2. Invertieren muss Farbanpassungsdaten tragen. Dies ist der entscheidende Unterschied zwischen Farbanpassung und Hervorhebung/Clipping – das Invertieren von Hervorhebung/Clipping ist ein reiner Befehl und muss nicht mit Daten verknüpft werden; aber der Invertier-Eintrag der Farbanpassung muss neben mode = SelectMode.invert auch brightness, saturation und contrast setzen, um den Farbanpassungseffekt für den Bereich außerhalb der Auswahl anzugeben.
  3. Die maximale Anzahl von Einträgen in einer einzelnen Liste beträgt 255. Bei Überschreitung wird ein Fehlercode zurückgegeben.

Schritt 3: Die Farbanpassungs-APIs verstehen

Alle farbanpassungsbezogenen Schnittstellen werden von LCCManager bereitgestellt, einschließlich einer SetTone-Methode und einer Beenden-Methode.

SetTone

// Rückgabewert: int
// 0: Erfolg
// 1: Liste ist null oder hat 0 Elemente
// 2: Listenelemente überschreiten das Maximum von 255
public int SetTone(List<ToneMix> _Mix)

Führt eine Farbanpassung des ausgewählten Bereichs durch und unterstützt Helligkeits-, Sättigungs- und Kontrastanpassungen. 2D-Textur-Einträge und 3D-Geometrie-Einträge können in derselben Liste gemischt werden.

QuitToneMode

// Rückgabewert: void
public void QuitToneMode()

Beendet den Farbanpassungsmodus und stellt die ursprünglichen Farben der Szene wieder her.

Tipp:

Rufen Sie beim Wechseln der Farbanpassungsparameter oder beim Löschen der aktuellen Farbanpassung zuerst QuitToneMode() auf und setzen Sie dann die neue Farbanpassung.

Schritt 4: Spezifikation der 2D-Maskentextur

Die 2D-Farbanpassung beschreibt die Auswahl über eine Maskentextur und unterstützt verschiedene Auswahlmethoden wie Vierecke, Dreiecke, Pinsel und Lasso – markieren Sie einfach die entsprechenden Pixel in der Textur mit dem Auswahlwert. Bei 2D-Operationen sollte die Kamera gesperrt und die Textur von einem festen Blickpunkt aus markiert werden. Die Textur und die Pixelwerte haben folgende Konventionen:

  • Die Textur ist fest 1024 × 1024, R8-Einkanal, ohne Mipmap, Punktfilterung (FilterMode.Point) und geklemmtes Sampling (TextureWrapMode.Clamp).
  • Pixelwert-Konventionen:
PixelwertBedeutung
128Standard (nicht ausgewählt)
240Ausgewählt
180Abwählen (den bereits ausgewählten Bereich löschen)
0Clipping

In einem Farbanpassungsszenario werden normalerweise nur die beiden Werte 128 (Standard) und 240 (ausgewählt) verwendet.

Schritt 5: Das Skript schreiben

Erstellen Sie ein neues C#-Skript namens Tone.cs. Vervollständigen Sie zunächst das Grundskelett: In Start in den Bearbeitungszustand wechseln und Daten laden; nach Abschluss des Ladens das Ladeflag setzen, damit die nachfolgenden Farbanpassungsmethoden es prüfen können.

using LCCCore;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Tone : MonoBehaviour
{
    public LCCManager m_manager;
    public string m_FilePath;
    public GameObject m_Box1;
    public Slider m_brightness;
    public Slider m_saturation;
    public Slider m_contrast;

    private LCCCore.Renderer m_renderer;
    private Camera m_camera;
    private bool m_isLoaded = false;

    void Start()
    {
        m_camera = Camera.main;
        m_manager.SetPlatformType(PlatformType.PC);

        // In den Bearbeitungsmodus wechseln; muss vor Load aufgerufen werden
        m_manager.SetEditorMode(true);

        m_renderer = m_manager.GetRender(this.transform);
        if (m_renderer == null)
            Debug.LogError("GetRender fehlgeschlagen. Prüfen Sie, ob der Manager korrekt gesetzt ist und der Dateipfad gültig ist.");

        m_renderer.Load(m_FilePath, onLoadProgress, onLoadCallback);
    }

    private void onLoadProgress(float value)
    {
        Debug.Log($"Ladefortschritt: {value}");
    }

    private void onLoadCallback()
    {
        Debug.Log("Daten geladen !!!");
        m_isLoaded = true;
    }

    // Farbanpassungsmethoden unten
}

Hinweis:

SetEditorMode(true) muss vor Load aufgerufen werden, um zu wirken; und SetTone muss nach Abschluss des Datenladens aufgerufen werden (nachdem der Callback onLoadCallback ausgelöst wurde). Die drei Slider m_brightness, m_saturation und m_contrast dienen zum dynamischen Anpassen der Farbanpassungsparameter zur Laufzeit und können nach Bedarf verwendet werden.

Schritt 6: Das Skript anhängen und Eigenschaften festlegen

  1. Hängen Sie das Skript Tone.cs an das GameObject LCCRenderer.
  2. Ziehen Sie im Fenster Inspektor das GameObject LCCManager auf die Eigenschaft Manager des Skripts.
  3. Tragen Sie den LCC-Dateipfad in die Eigenschaft File Path ein.
  4. Ziehen Sie Box1 in der Szene auf die Eigenschaft Box1 des Skripts und die drei Slider auf die Eigenschaften Brightness, Saturation und Contrast – für die 3D-Farbanpassung und die Laufzeit-Parameteranpassung.
Die Eigenschaften des Tone-Skripts im Inspektor festlegen

Die Eigenschaften des Tone-Skripts im Inspektor festlegen

Schritt 7: Beispiele für Farbanpassungsoperationen

Fügen Sie die folgenden Methoden zur Klasse Tone hinzu und rufen Sie die entsprechende Methode nach dem Ausführen und nach Abschluss des Datenladens auf.

Normale Farbanpassung

Konstruieren Sie eine R8-Maskentextur, markieren Sie die farbanzupassenden Pixel mit 240 und den Rest mit 128, konstruieren Sie dann ToneMix mit den Kameramatrizen, setzen Sie brightness, saturation und contrast und fügen Sie es der Liste hinzu.

public void onTone()
{
    // Die Texturgröße ist fest 1024*1024; die übrigen Eigenschaften wie im Beispiel beibehalten
    Texture2D _texture = new Texture2D(1024, 1024, TextureFormat.R8, false);
    _texture.filterMode = FilterMode.Point;
    _texture.wrapMode = TextureWrapMode.Clamp;

    int _count = 1024 * 1024;
    int _half = _count / 2;
    byte[] _values = new byte[_count];
    for (int i = 0; i < _count; i++)
    {
        if (i < _half)
            _values[i] = 128;    // 128 bedeutet Standard, 240 bedeutet ausgewählt, 0 bedeutet Clipping
        else
            _values[i] = 240;
    }
    _texture.SetPixelData(_values, 0);

    List<ToneMix> _tMixs = new List<ToneMix>();
    ToneMix _tmix01 = new ToneMix();
    _tmix01.editType = EditType.Edit2D;
    _tmix01.mv = m_camera.worldToCameraMatrix * this.transform.localToWorldMatrix;
    _tmix01.texture = _texture;
    _tmix01.mode = SelectMode.normal;
    _tmix01.mvp = GL.GetGPUProjectionMatrix(m_camera.projectionMatrix, true) * m_camera.worldToCameraMatrix * this.transform.localToWorldMatrix;
    _tmix01.brightness = 2.0f;
    _tmix01.saturation = 2.0f;
    _tmix01.contrast = 0.4f;
    _tMixs.Add(_tmix01);

    m_manager.SetTone(_tMixs);
}

Code-Erläuterung: Es wird eine Maskentextur erstellt, die die obere Bildschirmhälfte auswählt (der Bildschirmursprung ist die untere linke Ecke), und auf den ausgewählten Bereich wird eine Farbanpassung mit Helligkeit 2,0, Sättigung 2,0 und Kontrast 0,4 angewendet. Der Beispieleffekt ist wie folgt.

In der Praxis können Sie verschiedene Auswahlwerkzeuge wie Rechtecke, Dreiecke, Pinsel und Lasso verwenden, um die entsprechenden Positionen auf der Maske auszuwählen, und die Werte von brightness, saturation und contrast dynamisch über Slider übergeben.

Effekt der normalen Farbanpassung

Effekt der normalen Farbanpassung

Invertierte Farbanpassung

Das Invertieren der Farbanpassung unterscheidet sich von Hervorhebung und Clipping: Der Invertier-Eintrag muss neben dem Setzen von mode = SelectMode.invert Farbanpassungsdaten tragen (brightness, saturation, contrast), um den Farbanpassungseffekt für den Bereich außerhalb der Auswahl anzugeben. Basierend auf der obigen normalen Farbanpassung einfach einen Invertier-Eintrag anhängen.

public void onToneInvert()
{
    // Die Texturgröße ist fest 1024*1024; die übrigen Eigenschaften wie im Beispiel beibehalten
    Texture2D _texture = new Texture2D(1024, 1024, TextureFormat.R8, false);
    _texture.filterMode = FilterMode.Point;
    _texture.wrapMode = TextureWrapMode.Clamp;

    int _count = 1024 * 1024;
    int _half = _count / 2;
    byte[] _values = new byte[_count];
    for (int i = 0; i < _count; i++)
    {
        if (i < _half)
            _values[i] = 128;    // 128 bedeutet Standard, 240 bedeutet ausgewählt, 0 bedeutet Clipping
        else
            _values[i] = 240;
    }
    _texture.SetPixelData(_values, 0);

    List<ToneMix> _tMixs = new List<ToneMix>();

    // Farbanpassung der normalen Auswahl
    ToneMix _tmix01 = new ToneMix();
    _tmix01.editType = EditType.Edit2D;
    _tmix01.mv = m_camera.worldToCameraMatrix * this.transform.localToWorldMatrix;
    _tmix01.texture = _texture;
    _tmix01.mode = SelectMode.normal;
    _tmix01.mvp = GL.GetGPUProjectionMatrix(m_camera.projectionMatrix, true) * m_camera.worldToCameraMatrix * this.transform.localToWorldMatrix;
    _tmix01.brightness = 2.0f;
    _tmix01.saturation = 2.0f;
    _tmix01.contrast = 0.4f;
    _tMixs.Add(_tmix01);

    // Invertieren: muss Farbanpassungsdaten tragen (brightness/saturation/contrast), kein reiner Befehl
    ToneMix _tmix02 = new ToneMix();
    _tmix02.editType = EditType.Edit2D;
    _tmix02.mode = SelectMode.invert;
    _tmix02.brightness = 0.5f;
    _tmix02.saturation = 0.5f;
    _tmix02.contrast = 2.0f;
    _tMixs.Add(_tmix02);

    m_manager.SetTone(_tMixs);
}

Code-Erläuterung: Auf die normale Farbanpassung wird ein Invertier-Eintrag angehängt, der auf den Bereich außerhalb der Auswahl eine Farbanpassung mit Helligkeit 0,5, Sättigung 0,5 und Kontrast 2,0 anwendet. Auf diese Weise können innerhalb und außerhalb der Auswahl unterschiedliche Farbanpassungsparameter angewendet werden. Der Beispieleffekt ist wie folgt.

Effekt der invertierten Farbanpassung

Effekt der invertierten Farbanpassung

Hinweis:

Das Invertieren von Hervorhebung und Clipping ist ein reiner Befehl: Es genügt, einen Eintrag mit mode = SelectMode.invert anzuhängen, ohne dass weitere Daten erforderlich sind. Der Invertier-Eintrag der Farbanpassung muss jedoch auch brightness, saturation und contrast setzen; andernfalls verwendet der invertierte Bereich die Standardwerte (1,0) und erzielt nicht den erwarteten Effekt.

Schritt 8: Farbanpassung beenden

Rufen Sie QuitToneMode() auf, um die aktuelle Farbanpassung zu löschen und die ursprünglichen Farben der Szene wiederherzustellen.

public void onToneClear()
{
    m_manager.QuitToneMode();
}

Schlüsselschritte

Die Schlüsselschritte zum Farbanpassen einer 3DGS-Szene:

  1. SetEditorMode(true) vor dem Laden der Daten aufrufen, um in den Bearbeitungszustand zu wechseln.
  2. SetTone nach Abschluss des Datenladens aufrufen (nachdem der Callback onLoadCallback ausgelöst wurde, oder über einen Button/ein Ereignis ausgelöst).
  3. Den Farbanpassungseffekt über brightness, saturation und contrast von ToneMix steuern (Bereich [0, 3], Standard 1.0) und sicherstellen, dass die Hinzufüge-Reihenfolge der Farbanpassungsliste Ihrer Erwartung entspricht.
  4. Die 2D-Maskentextur ist fest 1024 × 1024, R8-Einkanal; Pixelwerte gemäß Konvention füllen (128 Standard, 240 ausgewählt).
  5. Das Invertieren der Farbanpassung (SelectMode.invert) muss brightness, saturation und contrast-Daten tragen – dies ist der entscheidende Unterschied zum Invertieren von Hervorhebung/Clipping.
  6. Beim Löschen oder Wechseln der Farbanpassung zuerst QuitToneMode() aufrufen.