Unity-Technologies/UnityCsReference · error · ArgumentException

material for submesh {submeshIndex} did not exist.

Error message

material for submesh {submeshIndex} did not exist.

What it means

instanceToTransmissiveIndex throws ArgumentException 'material for submesh {n} did not exist' when the submesh's entry in submeshMaterialIndices is -1. A -1 sentinel means that submesh has no material assigned, so there is no transmissive mapping to return. This is a data-state condition (the instance has submeshes but this one is unmaterialed), not an index-range error.

Source

Thrown at Editor/Mono/GI/LightBaker.bindings.cs:565

            return Internal_instanceAlbedoEmissiveIndex(instanceIndex);
        }
        public int instanceToEmissiveIndex(uint instanceIndex)
        {
            if (instanceIndex >= instanceCount)
                throw new ArgumentException($"index must be between 0 and {instanceCount - 1}, but was {instanceIndex}");
            return Internal_instanceAlbedoEmissiveIndex(instanceIndex);
        }
        public int instanceToTransmissiveIndex(uint instanceIndex, uint submeshIndex)
        {
            if (instanceIndex >= instanceCount)
                throw new ArgumentException($"index must be between 0 and {instanceCount - 1}, but was {instanceIndex}");
            Instance inst = instance(instanceIndex);
            int submeshCount = inst.submeshMaterialIndices.Length;
            if (submeshIndex >= submeshCount)
                throw new ArgumentException($"submeshIndex must be between 0 and {submeshCount - 1}, but was {submeshIndex}");
            int materialIndex = inst.submeshMaterialIndices[submeshIndex];
            if (materialIndex == -1)
                throw new ArgumentException($"material for submesh {submeshIndex} did not exist.");

            return Internal_instanceTransmissiveIndex(instanceIndex, submeshIndex);
        }

        public extern uint albedoTextureCount { get; }
        public extern uint albedoTexturePropertiesCount { get; }
        extern TextureData Internal_GetAlbedoTextureData(uint index);
        extern void Internal_SetAlbedoTextureData(uint index, TextureData textureData);

        public TextureData GetAlbedoTextureData(uint index)
        {
            if (index >= albedoTextureCount)
                throw new ArgumentException($"index must be between 0 and {albedoTextureCount - 1}, but was {index}");
            return Internal_GetAlbedoTextureData(index);
        }
        public void SetAlbedoTextureData(uint index, TextureData textureData)
        {
            if (index >= albedoTextureCount)

View on GitHub (pinned to 225b0fbdb5)

Solutions

  1. Check inst.submeshMaterialIndices[submeshIndex] != -1 before calling instanceToTransmissiveIndex.
  2. Treat a -1 entry as 'no material / not transmissive' and skip.
  3. Investigate upstream material assignment if the submesh should have a material.

Example fix

// before
int tIdx = lightBaker.instanceToTransmissiveIndex(instIdx, subIdx);

// after
Instance inst = lightBaker.instance(instIdx);
if (inst.submeshMaterialIndices[subIdx] == -1) continue;
int tIdx = lightBaker.instanceToTransmissiveIndex(instIdx, subIdx);
Defensive patterns

Strategy: validation

Validate before calling

Instance inst = lightBaker.instance(instanceIndex);
if (inst.submeshMaterialIndices[submeshIndex] != -1)
    int tIdx = lightBaker.instanceToTransmissiveIndex(instanceIndex, submeshIndex);

Prevention

When it happens

Trigger: Calling instanceToTransmissiveIndex on a submesh whose submeshMaterialIndices entry is -1; instances with partially-assigned materials (some submeshes missing materials).

Common situations: Meshes with mixed material assignment (e.g. some submeshes intentionally unmaterialed); editor state where a material slot was cleared; assuming every submesh has a material.

Related errors


AI-assisted analysis of Unity-Technologies/UnityCsReference@225b0fbdb5 (2026-08-13). Data as JSON: /api/errors/a4edd5c616c9075d. Report an issue: GitHub.