HVHAULVISION SHADER STUDIO
ShaderStudioDownloadInstallBuildUseDump & WorkspaceEditValidationTroubleshoot
HaulVision Shader Studio branding
Website development packageCurrent download: HaulVisionShaderStudio.zip • 7.3 MiB • ATS 1.61.1.1 source/tool package. Build Release x64 and use the staged dist\release output for installation.

HaulVision Shader Studio

Standalone ATS 1.61.1.1 shader inspection, dumping, faithful HLSL reconstruction, interface validation, and live replacement testing. This guide is completely offline and ships with the clean source/release package.

Development / testing tool — not a gameplay shader loader.

HaulVision Shader Studio is intended for shader development, inspection, validation, and short live hot-swap tests. The live replacement feature exists so an author can quickly verify an edited shader in ATS, compare it against the native shader, then restore the original. It is not intended to remain active for normal gameplay or to be distributed as the runtime for a finished graphics mod.

Shader Studio deliberately carries a large 1.61 shader catalog, engine-registry discovery, DXBC fallback data, capture hooks, validation, workspace generation, and editor tooling. Those development systems add complexity and overhead that a finished mod should not need. Once a shader is validated, move the finished replacement into a purpose-built release/runtime implementation and use Shader Studio only when additional testing is required.
Standalone DLLNative D3D11F8 UINo ReShadePS + VS

1. Installation

1Build or obtain the staged release

After a successful Release x64 build, use the contents of dist\release.

2Copy into ATS

Copy the contents of dist\release into American Truck Simulator\bin\win_x64.

3Launch ATS in DX11

The plugin loads from the ATS plugin folder. No ReShade DLL or .addon64 is used.

4Press F8

F8 opens/closes Shader Studio. While open, Shader Studio captures mouse/keyboard input so ATS does not steer the camera underneath the UI.

American Truck Simulator\bin\win_x64\
└─ plugins\
   ├─ HaulVisionShaderStudio.dll
   └─ HaulVisionShaderStudio\
      ├─ data\
      │  ├─ effect_shader_runtime_catalog.csv
      │  ├─ effect_pass_runtime_catalog.csv
      │  ├─ effect_catalog_metadata.json
      │  └─ dxbc_cache\
      ├─ captures\
      └─ logs\
Important: When updating Shader Studio, copy the staged HaulVisionShaderStudio data folder as well as the DLL. Registry-only shaders use the DXBC fallback cache when ATS has already released their in-memory bytecode.

2. Building from source

Double-click BUILD_HAULVISION_SHADER_STUDIO_1_61_1_1.bat. Visual Studio 2022 with Desktop development with C++ is required. Python 3 is optional for normal builds because this clean package already includes the 1.61.1.1 catalogs and DXBC cache.

Updating after a future ATS shader change: place a current effects.zip beside the BAT. If Python 3 is available, the build script regenerates the shader/effect catalog, validates it, then rebuilds the exact DXBC fallback cache before compiling the DLL.

3. Using Shader Studio in game

HaulVision Shader Studio in-game interface
Actual in-game standalone Shader Studio UI. The final clean build retains this HaulVision purple/graphite theme and responsive stage filters.

Live Shaders

Shows shader objects currently known to ATS. Shader names are resolved from current SCS object identities and/or exact DXBC fingerprints.

Use the search box for names such as sky, fog, water, or a CRC32.

1.61 Catalog

Shows the full current catalog even when a shader has not yet appeared in the live registry. Use this to confirm an identity exists and inspect mappings.

PS / VS / Other

Filter pixel and vertex shaders independently. Faithful HLSL compile/load currently targets Shader Model 5 PS and VS.

Flash Selected

Temporarily blinks draws using the selected PS/VS, making it easier to determine exactly what the shader affects. Stop Flash before judging final rendering.

4. Dumping and creating a shader workspace

Select a live shader, then use Create / Refresh Workspace. Shader Studio resolves the exact original DXBC from live memory when possible, otherwise from the verified 1.61.1.1 catalog cache.

Every workspace is organized by stage → effect → full shader identity:

captures\PS\eut2.sky\
└─ PS_391AD521_0FF00CFEF8FD1EA0_eut2.sky\
   ├─ PS_391AD521_0FF00CFEF8FD1EA0_eut2.sky_original.dxbc
   ├─ PS_391AD521_0FF00CFEF8FD1EA0_eut2.sky_faithful.hlsl
   ├─ PS_391AD521_0FF00CFEF8FD1EA0_eut2.sky_replacement.dxbc
   ├─ PS_391AD521_0FF00CFEF8FD1EA0_eut2.sky_live.dxbc
   ├─ PS_391AD521_0FF00CFEF8FD1EA0_eut2.sky_live.asm
   ├─ PS_391AD521_0FF00CFEF8FD1EA0_eut2.sky_faithful_compile.log
   ├─ PS_391AD521_0FF00CFEF8FD1EA0_eut2.sky_faithful_validation.txt
   └─ PS_391AD521_0FF00CFEF8FD1EA0_eut2.sky_shader_info.txt
Dump All Workspaces creates the same organized structure for all captured shaders and writes a manifest. It can take time because faithful HLSL reconstruction/validation is performed for supported shaders.

5. Editing faithful.hlsl

The faithful file is reconstructed from the real DXBC and compiled back using the original shader profile (ps_5_0 or vs_5_0). The safest workflow is to change shader math while preserving the original interface contract.

Usually safe edits

  • Change arithmetic inside main.
  • Adjust tint, exposure, contrast, fog strength, alpha, blends, or other calculations.
  • Change numeric constants used by existing calculations.
  • Change how existing texture/cbuffer values are combined.
  • Keep existing inputs, outputs, texture slots, sampler slots and constant-buffer layouts intact.

Common causes of rejection

  • Renaming/removing input or output semantics.
  • Moving a semantic to another register or changing its component type.
  • Adding/removing ordinary texture, sampler, UAV or cbuffer bindings.
  • Changing a cbuffer's slot or byte size.
  • Changing comparison-sampler behavior.
  • Deleting declarations merely because they appear unused.
  • Changing the entry point name from main.

6. Shader validation — how to get clean replacements

Compile + Load Faithful HLSL does not blindly inject whatever compiled. Shader Studio first compiles the HLSL, then reflects/disassembles the rebuilt DXBC and compares its game-facing interface with the original ATS shader.

Validation areaWhat Shader Studio checksWhat you should preserve
Input signatureSemantic name/index, register, component mask/type, system value.Do not rename, remove, reorder into different registers, or alter types.
Output signatureSemantic name/index, register, component mask/type, system value.Keep the same render-target/output contract.
Constant buffersBinding type, slot, count and cbuffer byte size.Keep the original slot and exact size unless using a supported Studio extension.
SamplersSlot/count and whether it is a comparison sampler.Do not convert ordinary samplers to comparison samplers or vice versa.
Other resourcesBinding contract including slots/counts and resource characteristics.Reuse the original texture/resource bindings instead of adding/removing them.

The result you want

MISMATCH_CLASS=NONE
RESULT=COMPATIBLE
The rebuilt shader is replacement-ready only when RESULT=COMPATIBLE.

When the validation report ends with RESULT=COMPATIBLE, Shader Studio copies the accepted build to the identity-named _replacement.dxbc and the UI can load it.

If the shader compiles but validation fails

MISMATCH_CLASS=GENERAL_INTERFACE_MISMATCH
RESULT=REJECTED

Do not force-load that shader. Shader Studio moves rejected compiled output to an identity-named _live_REJECTED.dxbc. Open the matching _faithful_validation.txt and find the first MISMATCH line.

Input/Output mismatch

Restore the original semantic, register, mask, component type and system-value declaration.

Resource mismatch

Restore the original texture/sampler/cbuffer binding. Avoid declaring a new resource only for convenience.

Count mismatch

The rebuilt shader has gained or lost an interface item. Compare declarations against the untouched faithful file.

Compile error

Read _faithful_compile.log. This is an HLSL syntax/type/include/compiler failure, not an interface-validation failure.

Automatic repair categories

Shader Studio can recognize narrowly defined cases such as sparse signature masks, semantic register/lane layout changes, or an original resource-declaration superset. It may attempt an exact interface-skeleton repair. If the report still ends in RESULT=REJECTED, treat it as rejected.

dxbcSigner note: Sparse DXBC signature repair can require dxbcSigner.dll. The clean standalone package does not include that external signer. The most reliable user workflow is therefore to preserve the original interface so the shader passes validation without needing signature repair.

Standard Shader Studio b13 extensions

DefineSlotMaximum accepted sizeRegisters
#define HVSS_USE_PARAMS_4_V1 1b1364 bytes4 × float4
#define HVSS_USE_PARAMS_8_V1 1b13128 bytes8 × float4
#define HVSS_USE_PARAMS_12_V1 1b13192 bytes12 × float4
#define HVSS_USE_PARAMS_16_V1 1b13256 bytes16 × float4

When Shader Studio creates any shader workspace it also creates captures\_shared\HVSS_StandardBuffers.hlsli. Add one profile define before including that file:

#define HVSS_USE_PARAMS_8_V1 1
#include "HVSS_StandardBuffers.hlsli"

// 8 neutral float4 registers are now declared at b13.
// Give each lane a meaning that makes sense for your replacement.
float exposure = HVSS_PARAM1(0, 0);
float contrast = HVSS_PARAM1(0, 1);
float4 userColor = HVSS_PARAM4(1);
What the profile does: it tells the compiler and Shader Studio validator that one additional user-owned constant buffer named HVSS_PARAMS is intentionally present at b13. It does not change ATS's native shader interface and it does not authorize new textures, samplers, UAVs, or other cbuffers.
Parameter-value note: Shader Studio validates the extra b13 contract, but the current standalone build does not automatically invent or animate values for HVSS_PARAMS. A runtime that wants live custom values must bind a matching constant buffer to b13. If nothing binds it, treat the values as unavailable/zero and keep a safe fallback path in the shader.

Custom standard size without editing Shader Studio source

If 64/128/192/256 bytes do not fit your project, choose any size from 16 through 256 bytes in 16-byte increments. Define the number of float4 registers, then include the same standard header:

#define HVSS_USE_CUSTOM_PARAMS_V1 1
#define HVSS_CUSTOM_PARAMS_FLOAT4_COUNT 6
#include "HVSS_StandardBuffers.hlsli"

// 6 × 16 bytes = a 96-byte maximum b13 layout.
float strength = HVSS_PARAM1(0, 0);
float radius   = HVSS_PARAM1(0, 1);
float4 tint    = HVSS_PARAM4(1);

Valid custom counts are 1..16. Shader Studio parses the count from the HLSL and records it in the validation report and the generated *.atsvt.ini sidecar. A count of 6, for example, authorizes up to 96 bytes.

How to design a clean custom parameter layout

  1. Confirm b13 is free in the original shader. Search the untouched faithful HLSL/assembly and validation resource list. If ATS already owns b13 for that shader, do not add an HVSS b13 extension.
  2. Choose the smallest profile that fits. Four scalar/vector registers often cover tint, strength, ranges, and toggles. Do not choose 256 bytes just because it is available.
  3. Keep each logical parameter stable. Document what each lane means, for example hvss_param[0].x = exposure and hvss_param[1].xyz = tint. Treat that mapping as your ABI.
  4. Use one extension only. Do not combine multiple HVSS_USE_* profiles. Each standard profile targets the same generic b13 extension slot.
  5. Do not exceed the declared count. With HVSS_USE_PARAMS_4_V1, valid indexes are 0–3. With a custom count of 6, valid indexes are 0–5.
  6. Preserve the ATS interface. The extra b13 block is the only authorized addition. Inputs, outputs, original cbuffers, textures, samplers and slots still have to validate exactly.
  7. Read the report after every compile. A clean generic extension reports HVSS_STANDARD_EXTENSION=..., HVSS_STANDARD_SLOT=13, its float4 count/max bytes, then ends with RESULT=COMPATIBLE.

A successful 8-register preset will contain lines similar to:

HVSS_STANDARD_EXTENSION=HVSS_PARAMS_8_V1
HVSS_STANDARD_SLOT=13
HVSS_STANDARD_FLOAT4_COUNT=8
HVSS_STANDARD_MAX_BYTES=128
authorized_resource_additions=1
MISMATCH_CLASS=NONE
RESULT=COMPATIBLE

D3DCompile may reflect a smaller cbuffer if your HLSL only reads the first few registers. Shader Studio therefore accepts a standard extension up to the selected profile's maximum size rather than requiring unused tail registers to survive compilation.

Creating a named standard preset for a distributed project

Most users should use HVSS_USE_CUSTOM_PARAMS_V1; it avoids C++ changes. If you maintain a project and want a stable named preset such as HVSS_USE_MYPROJECT_V1, use the following pattern:

  1. Add the named profile to graphics\hvss_standard_buffers_source.hpp and map it to a fixed HVSS_PARAM_FLOAT4_COUNT.
  2. Add a matching entry to kStandardExtensions in graphics\dxbc_faithful_decompiler.cpp with the define name, public layout name, and float4 count.
  3. Keep the slot at b13 unless you also intentionally redesign the validator/runtime contract. The stock standard validator only authorizes the generic extra cbuffer at b13.
  4. Bump the preset version when its byte layout changes. Never silently redefine an existing _V1 layout.
  5. Document every lane and provide a runtime that binds the same byte size/slot if the shader expects live values.
  6. Compile one edited shader and confirm the report shows the expected profile and RESULT=COMPATIBLE before distributing it.

7. Loading and testing a replacement

Use live replacement only as a quick test. Load an edited shader, inspect the result, A/B it against the native shader, then restore the original. Do not treat Shader Studio as the permanent loader for normal driving sessions.
  1. Select the shader in Live Shaders.
  2. Create/refresh its workspace once.
  3. Edit the identity-named _faithful.hlsl.
  4. Click Compile + Load Faithful HLSL.
  5. Only a successfully validated build is accepted by this path.
  6. Use Replacement enabled to A/B test edited vs native rendering.
  7. Use Restore Original ATS Shader to unload the replacement completely.
External DXBC: Load Workspace Replacement DXBC and Browse for DXBC... are expert paths. If you compiled externally, validate the interface first. The integrated Compile + Load path is safer because validation is automatic before loading.

8. Troubleshooting

SymptomCheck
Shader name is UNMAPPEDMake sure the current runtime catalog/data folder was copied with the DLL. Refresh Registry after the scene finishes loading.
Dump button exists but ATS released live DXBCThe installed data\dxbc_cache must match the catalog. The cache supplies exact catalog DXBC when live bytes are gone.
No faithful HLSLFaithful reconstruction currently targets SM5 PS/VS and may reject unsupported DXBC instructions/resource types. The original DXBC can still be dumped.
No D3DCompiler DLL was availableThe faithful compiler looks for d3dcompiler_47.dll, then 46, then 43. Repair/install the applicable Windows DirectX compiler component.
HLSL compiled but did not loadOpen the identity-named validation report. A compile success is not enough; the report must say RESULT=COMPATIBLE.
Replacement behaves incorrectlyDisable it immediately, restore the original ATS shader, then review the edit. Passing interface validation guarantees the binding contract, not that the shader math produces the intended visual result.

9. Clean package contents

This clean source intentionally excludes old ReShade/ATS Visual Toolkit artifacts, 1.60 target tables, historical phase notes, legacy replacement packs, unused database/decompiled placeholders, obsolete build scripts, and generated Python cache files.

HaulVision_ShaderStudio_STANDALONE_ATS_1.61.1.1_STANDARD_EXTENSIONS\
├─ BUILD_HAULVISION_SHADER_STUDIO_1_61_1_1.bat
├─ HaulVisionShaderStudio.sln
├─ HaulVision_Shader_Studio_Offline_Guide.html
├─ README.md
├─ LICENSE
├─ build\
├─ src\HaulVisionShaderStudio\
├─ tools\
└─ data\
   ├─ current 1.61 catalog files
   └─ dxbc_cache\