### Issue part 2:
After fixing part 1, one will encounter these sorts of compile issues in a material:
```cpp
[SM6] D:\Subsolar\gad\Engine\Shaders\Private\MaterialTemplate.ush(5178,145): Shader FLumenCardPS, Permutation 0, VF FLocalVertexFactory:
/Engine/Generated/Material.ush:5178:145: error: use of undeclared identifier ‘Material’
float4 Local187 \= ProcessMaterialVirtualColorTextureLookup(TextureVirtualSample(Material.TextureCollectionPhysical\_1, GetMaterialSharedSampler(Material.TextureCollectionSampler\_1, View\_SharedBilinearAnisoClampedSampler), Local186, 0, VTUniform\_Unpack(Local163\.PackedUniform)));
^
[SM6] Shader debug info dumped to: “D:\Subsolar\subsolar-main\Saved\ShaderDebugInfo\PCD3D_SM6\M_SuperMaterial_53426f2a1ec3d00a\Default\FLocalVertexFactory\FLumenCardPS\0”
D:\Subsolar\gad\Engine\Shaders\Private\MaterialTemplate.ush(5156,30): Shader FLumenCardPS, Permutation 0, VF FLocalVertexFactory:
/Engine/Generated/Material.ush:5156:30: error: use of undeclared identifier ‘Material’
Texture2D\<uint4\> Local165 \= Material.TextureCollectionPageTable\_1;
^
```
The origin of this issue is in `FHLSLMaterialTranslator::TextureSample` (`HLSLMaterialTranslator.cpp:7554/HLSLMaterialTranslator.cpp:7962`)
```cpp
…
else if (bFromCollection && bVirtualTexture)
{
CoerceParameter(TextureIndex, TextureType);
FMaterialUniformExpression* UniformExpression = GetParameterUniformExpression(TextureIndex);
if (!UniformExpression || !UniformExpression->GetTextureCollectionUniformExpression())
{
return Errorf(TEXT(“The provided uniform expression is not from a texture collection”));
}
FMaterialUniformExpressionTextureCollection* CollectionExpression = UniformExpression->GetTextureCollectionUniformExpression();
VirtualTextureIndex = CollectionExpression->GetTextureCollectionTypePrefixIndex();
if (SamplerSource != SSM_FromTextureAsset)
{
const bool bUseAnisoSampler = VirtualTextureScalability::IsAnisotropicFilteringEnabled() && MipValueMode != TMVM_MipLevel;
const TCHAR* SharedSamplerName = bUseAnisoSampler ? TEXT(“View.SharedBilinearAnisoClampedSampler”) : TEXT(“View.SharedBilinearClampedSampler”);
TextureName += FString::Printf(TEXT(“Material.TextureCollectionPhysical_%d, GetMaterialSharedSampler(Material.TextureCollectionSampler_%d, %s)”), VirtualTextureIndex, VirtualTextureIndex, SharedSamplerName);
}
else
{
TextureName += FString::Printf(TEXT(“Material.TextureCollectionPhysical_%d, Material.TextureCollectionSampler_%d”), VirtualTextureIndex, VirtualTextureIndex);
}
NumVtSamples++;
}
…
else if (bFromCollection)
{
FString TextureCode = GetParameterCode(TextureIndex);
SampleInfo.PageTableIndex = AddInternalCodeChunk(
MCT_Unexposed, TEXT(“Texture2D<uint4>”),
*FString::Printf(TEXT(“Material.TextureCollectionPageTable_%i”), VirtualTextureIndex)
);
FString Uniforms = GetParameterCode(AddInternalCodeChunk(
MCT_Unexposed, TEXT(“FIndirectVirtualTextureUniform”),
*FString::Printf(TEXT(“GetIndirectVirtualTextureUniform(%i)”), VirtualTextureIndex)
));
// Manually unpack the page table to redirect the page boundaries
SampleInfo.PageTableUniformIndex = AddInternalCodeChunk(
MCT_Unexposed, TEXT(“VTPageTableUniform”),
*FString::Printf(
TEXT(“UnpackIndirectVirtualTexturePageTableUniform(%s, %s.PackedPageTableUniform[0], %s.PackedPageTableUniform[1])”),
*TextureCode, *Uniforms, *Uniforms
)
);
VTPackedUniformName = FString::Printf(TEXT(“VTUniform_Unpack(%s.PackedUniform)”), *Uniforms);
VTStackIndex = AcquireVTStackIndex(SampleInfo, UV_Value, UV_Ddx, UV_Ddy);
VTPageTableLayerIndex = 0;
}
…
```
Basically there are two distinct indices in play:
* Collection uniform slot index (overall texture collection parameter index):
This is the index used to name/declare UB members like:
`Material.TextureCollection_#`, and for virtual collections: `Material.TextureCollectionPageTable_#`, `Material.TextureCollectionPhysical_#`, `Material.TextureCollectionSampler_#`. These are allocated in order of `UniformTextureCollectionParameters` (`MaterialUniformExpressions.cpp:611`).
* Virtual-collection type-prefix index:
This is the index into the packed-uniform array `Material.TextureCollectionPackedUniforms[…]`, which is sized by virtual collection count only (`MaterialUniformExpressions.cpp:409`).
The code uses `VirtualTextureIndex = TextureCollectionTypePrefixIndex;`to name `TextureCollectionPageTable/Physical/Sampler_`*,* but those UB members are indexed by the collection uniform slot (the overall `TextureCollection_` index). With mixed virtual + non-virtual collections, `prefix != slot`.
[Attachment Removed]