01. Ext 基础
引言
CSP EXT config本质是一堆ini文件,语法遵循CSP inipp语法(一种专为csp设计的ini扩展语法)。
对于每个INI文件其整体结构主要由若干个[SECTION]块组成,而对于每个SECTION块来说主要由KEY和VALUE组成。
在本章节你暂不需要了解如何编写EXT,只需要了解其大致框架即可,关于每个ext模板具体使用方式在具体章节会有介绍,如果想要了解详细完整inipp语法请参阅 inipp语法章节
加载路径
⚽
想要让ext能够正常工作,就必须先知道他在哪里工作!
EXT 文件路径
车辆:
content
└─ cars
└─ car_name
└─ extension └─ ext_config.ini
赛道:
content
└─ tracks
└─ track_name
└─ extension └─ ext_config.ini
Skin 独立配置:
content
└─ cars
└─ car_name
└─ skins └─ skin_name └─ ext_config.ini
所有配置文件需自行创建或复制放置。
Section 结构
🦄
对于EXT来说,写一个section, 就可以给我们的mod增加一个“效果”
section的抽象结构只包含section名称,key和value
在INI文件中通常用;来写注释
以下是抽象定义
[SECTION_...] ;省略号为自动索引也可以人工索引
KEY = VALUE ;KEY代表参数,VALUE代表值实际例子
[REFLECTIONS_FX]
GLASS_FILTER = material:Taillight以上例子就是一个反射特效的section,而它带有一个glass_filter参数,具体我们想要生效的值为 material:Taillight
Ext推荐目录结构
🌅
一个良好的目录结构便于你更好的组织你的文件
推荐ext文件结构如下
extensions
├── ext_config.ini
├── animations.ini
├── materials.ini
├── lights.ini
├── misc.ini
└── textures
└── texture.dds
ext_config.ini
- 主配置文件,用于加载其他配置文件
animations.ini
- 主动画配置文件,加载各种动画配置
materials.ini
- 材质配置文件,用于编写自定义材质,更细致的可以分为内外饰
lights.ini
- 灯光配置文件,存放各类与光效相关的配置
Textures
- 存放额外需要自定义读取的贴图文件
Ext示例模板
🏕️
让我们用一个官方的实际ext config 带你了解一个完整的配置文件都是如何工作的
CSP中的可作用功能非常广泛,下面有一个csp的官方例子,里面的效果都会在后面的常用模板中提到,在这儿主要看一下,找找感觉即可
;在ini文件中都用;表示注释
;所有[]包裹的叫做section,我们称之为节
[INCLUDE] ;导入节,主要用于导入常用的预设好的ext配置
INCLUDE = common/no_popup_lights.ini
[EXTRA_FX] ;提供额外效果的节
SKIP_GBUFFER = INT_Displa_VEtro
[REFLECTIONS_FX] ;提供反射效果
GLASS_FILTER = material:Taillight
[PARTICLES_FX] ;烟雾效果
SMOKE_BLOCK_START = 0.4
SMOKE_BLOCK_END = 0.6
; SMOKE_COLOR = 0, 0.5, 1
; SMOKE_FORCE_THICKNESS = 1
; [PARTICLES_FX_SMOKE_0]
; TYRES_LEFT = 1
; COLOR = 1, 1, 0
; [PARTICLES_FX_SMOKE_1]
; TYRES_RIGHT = 1
; COLOR = 1, 0, 1
; [PARTICLES_FX_SMOKE_2]
; TYRES = SV
; COLOR = 1, 1, 1
[LIGHTING] ;灯光效果
INTERIOR_FAKE_UPPER_SHADOW_HEIGHT = 0.04
INTERIOR_FAKE_UPPER_SHADOW_FADE = 0.05
EMISSIVE_HEADLIGHTS_MULT = 3
EMISSIVE_PARKINGLIGHTS_MULT = 1
EMISSIVE_BRAKELIGHTS_MULT = 0.2
; [EXTRA_FX_EMISSIVE_...]
; MESHES = INT_DIALS_SUB0
; COLOR = 0
[EXTRA_FX_EMISSIVE_...] ;额外发光效果
MATERIALS = EXT_LIGHT_GRADIENT, Taillight
RANGE = 0.2
COLOR = 0.1
[EXTRA_FX_EMISSIVE_...];额外发光效果
MESHES = polymsh_extracted15_SUB18
RANGE = 0.04
COLOR = 0.5
[EXTRA_FX_EMISSIVE_...];额外发光效果
MESHES = polymsh_extracted15_SUB5
RANGE = 0.1
[EXTRA_FX_EMISSIVE_...];额外发光效果
MATERIALS = INT_Display
DIGITAL_INSTRUMENTS = ?
[BOUNCED_INTERIOR_LIGHT]
MULT = 1,1,1,2
[SMART_MIRROR]
VISIBLE_FIRSTPERSON = RIGHT
[INSTRUMENTS]
SPEED_LAG = 0.7
SPEED_LIMIT = 270
[ODOMETER_MAIN] ;里程表(旧)
NAME = INT_DIALS_SUB0
FONT = odometer_font
BLEND_MODE = 0
POSITION = 83, 262
ROTATION = 00
SCALE = 1,1
SIZE = 119, 25
DIGIT_WIDTH = 11
COUNT = 6
BACKGROUND = 0.08, 0.08, 0.09
COLOR = 1, 1, 1
JITTER = 0.07
MOVEMENT_INTERVAL = 5
[ODOMETER_TRIP];里程表(旧)
NAME = INT_DIALS_SUB0
FONT = odometer_font
BLEND_MODE = 0
POSITION = 83, 335
SIZE = 121, 25
DIGIT_WIDTH = 11
COUNT = 5
BACKGROUND = 0.08, 0.08, 0.09
COLOR = 1, 1, 1
LAST_DIGIT_COLOR = 0, 0, 0
LAST_DIGIT_BACKGROUND = 1, 1, 1
LAST_DIGIT_BACKGROUND_LOCATION = 99,19
JITTER = 0.09
MOVEMENT_INTERVAL = 1
[DEFORMING_HOOD] ;形变效果
NAME = MOTORHOOD
OFFSET_Y_MIDDLE = 0.06
OFFSET_Y_END = -0.03
OFFSET_Z_END = 0.06
BULGING_EXTRA = 0.2
BULGING_EXPONENT = 2.0
NOISE_Y_AMPLITUDE = 0.16
NOISE_Z_AMPLITUDE = 0.2
NOISE_Y_FREQENCY = 7.0
NOISE_Z_FREQENCY = 7.0
Z_FACTOR = 2.5
Z_BIAS = 0.15
[DEFORMING_REAR]
NAME = REARHOOD
OFFSET_Y_MIDDLE = 0.04
OFFSET_Y_END = 0.005
OFFSET_Z_END = 0.01
BULGING_EXTRA = 0.2
BULGING_EXPONENT = 1.0
NOISE_Y_AMPLITUDE = 0.4
NOISE_Z_AMPLITUDE = -0.4
NOISE_Y_FREQENCY = 4.0
NOISE_Z_FREQENCY = 5.0
Z_FACTOR = 2.5
[TYRES_FX] ;轮胎特效
DIRT_WIDTH_K = 1.2
[SHADER_REPLACEMENT_...] ;重要! 核心功能 shader替换
MATERIALS = Chrome ;生效材质
PROP_... = extExtraSharpLocalReflections, -0.001 ;shader参数替换
[SHADER_REPLACEMENT_...]
MATERIALS = Tyre_Tread ;生效材质
PROP_... = ksAmbient, 0.1 ;shader参数替换
PROP_... = ksDiffuse, 0.1
PROP_... = fresnelEXP, 5
PROP_... = fresnelMaxLevel, 0.1
PROP_... = fresnelC, 0
[INCLUDE: common/custom_emissive.ini] ;自定义发光特效 重要!
[CustomEmissive]
Meshes = front_light02 ; disabling emissive for this mesh
[CustomEmissive]
Meshes = reverse_lights
ColorMasksAsMultiplier = 1
@ = CustomEmissive_Rect, Center = "0.92, 0.5", Size = "0.15, 0.94", CornerRadius = "0.4, 0.2", Exponent = 3
@ = CustomEmissive_Color, Color = '1, 1, 1', Threshold = '0.98, 10'
@ = ReverseLights
[CustomEmissive]
Meshes = brake_lights
@ = CustomEmissive_Rect, Center = "0.74, 0.5", Size = "0.22, 0.94", CornerRadius = "0.3, 0.2", Exponent = 3
[CustomEmissive]
Meshes = rear_lights
@ = CustomEmissive_Rect, Center = "0.528, 0.5", Size = "0.22, 0.94", CornerRadius = "0.3, 0.2", Exponent = 3
[CustomEmissive]
Meshes = g_BODY_EXT_SUB8
ColorMasksAsMultiplier = 1
@ = CustomEmissive_Rect, Channel = 3, Mirror, Center = "0.125, 0.5", Size = "0.25, 0.94", CornerRadius = "0.2, 0.2", Exponent = 3
@ = CustomEmissive_Color, Channel = 3, Mirror, Color = '1, 0.5, 0', Threshold = '0.9, 10'
@ = CustomEmissive_Rect, Channel = 2, Center = "0.338, 0.5", Size = "0.18, 0.94", CornerRadius = "0.28, 0.2", Exponent = 3
@ = CustomEmissive_BounceBack, Channel = 2
@ = TurningLightsRear, Channel = 3
[CustomEmissive]
Meshes = g_Bumper_F_SUB3
@ = CustomEmissive_Color, Channel = 3, Mirror, Color = '1, 0.5, 0', Threshold = '0.9, 10'
@ = TurningLightsFront, Channel = 3
[CustomEmissive]
Meshes = Cylinder2_SUB1, Cylinder_SUB1, Cylinder3_SUB1, Cylinder4_SUB1
@ = CustomEmissive_Rect, Channel = 0, Center = "0.6, 0.67", Size = "0.05, 0.3", CornerRadius = "0, 1", Exponent = 1.5
@ = DashIndicator, Channel = 0, Input = LIGHT, Color = 5, Lag = 0
[CustomEmissive]
Meshes = INT_DIALS_SUB0
AreasSubtractive = 1
@ = CustomEmissive_AreaMask, Center = "0.723, 0.273", Size = 0.55, CornerRadius = 1, Exponent = 0.3
@ = CustomEmissive_AreaMask, Center = "0.275, 0.6", Size = 0.55, CornerRadius = 1, Exponent = 0.3
@ = CustomEmissive_AreaMask, Center = "0.116, 0.117", Size = 0.23, CornerRadius = 1, Exponent = 0.3
@ = CustomEmissive_AreaMask, Center = "0.361, 0.117", Size = 0.23, CornerRadius = 1, Exponent = 0.3
[CustomEmissiveMulti]
Meshes = polymsh_extracted15_SUB18
Resolution = 512, 512
@ = CustomEmissive_UseDiffuseLuminocity, From = 0.1, 0.12
@ = MultiItem, Input = TURNSIGNAL_LEFT, Center = "99, 137", Size = 25
@ = MultiItem, Input = TURNSIGNAL_RIGHT, Center = "127, 137", Size = 25
@ = MultiItem, Input = HIGHBEAM, Center = "173, 138", Size = 25
@ = MultiItem, Input = HIGHBEAM, Center = "126, 498", Size = 25
@ = MultiItem, Input = LIGHT, Center = "194, 498", Size = 25
@ = MultiItem, Role = DashWarningABS, Center = "340, 498", Size = 25
@ = MultiItem, Input = HANDBRAKE, Center = "426, 498", Size = 25
@ = MultiItem, Input = STALLED, Center = "457, 498", Size = 25
@ = MultiItem, Role = DashWarningEngine, Center = "492, 498", Size = 26
@ = MultiItem, Input = STALLED, Color = "0, 8, 0", Center = "248, 501", Size = "50, 25"
@ = MultiItem, Input = ENGINE_LIFE, InputThreshold = 700, InputInverse, Color = "7, 7, 0", Center = "282, 501", Size = "14, 25"
@ = MultiItem, Input = ENGINE_LIFE, InputThreshold = 200, InputInverse, Color = "20, 0, 0", Center = "298, 501", Size = "14, 25"
[SHADER_REPLACEMENT_...]
MATERIALS = Taillight, Headlight
PROP_... = extColoredBaseReflection, 0.8
PROP_... = fresnelEXP, 5
PROP_... = fresnelMaxLevel, 1
PROP_... = fresnelC, 0.1
PROP_... = isAdditive, 0
PROP_... = ksDiffuse, 0.2
PROP_... = ksAmbient, 0.4
DOUBLE_FACE_SHADOW_BIASED = 1
[SHADER_REPLACEMENT_...]
MATERIALS = BMW_Logos
PROP_... = fresnelEXP, 5
PROP_... = fresnelMaxLevel, 1
PROP_... = fresnelC, 0.2
PROP_... = isAdditive, 0
[SHADER_REPLACEMENT_...]
MATERIALS = Rim
PROP_... = fresnelEXP, 5
PROP_... = fresnelMaxLevel, 1
PROP_... = fresnelC, 0.3
PROP_... = isAdditive, 0
PROP_... = ksSpecular, 0.5
PROP_... = ksSpecularEXP, 40
PROP_... = extExtraSharpLocalReflections, -0.001
DOUBLE_FACE_SHADOW_BIASED = 1
[SHADER_REPLACEMENT_...]
MATERIALS = INT_Plastica_Grigia, INT_Skin_plastica_B
DOUBLE_FACE_SHADOW_BIASED = 1
[SHADER_REPLACEMENT_...]
MATERIALS = Plastic_Black, Rubber, EXT_FASCIABUMPER
PROP_... = ksSpecular, 0.05
PROP_... = ksSpecularEXP, 10
PROP_... = ksDiffuse, 0.1
PROP_... = fresnelEXP, 5
PROP_... = fresnelMaxLevel, 1
PROP_... = fresnelC, 0.05
[SHADER_REPLACEMENT_...]
MATERIALS = Details
PROP_... = ksSpecular, 0
PROP_... = ksSpecularEXP, 10
PROP_... = ksDiffuse, 0.1
PROP_... = fresnelEXP, 5
PROP_... = fresnelMaxLevel, 0.2
PROP_... = fresnelC, 0.01
[SHADER_REPLACEMENT_...]
MATERIALS = Headlight_Glass
PROP_... = ksSpecularEXP, 500
PROP_... = ksSpecular, 1
PROP_... = ksDiffuse, 0.1
PROP_... = ksAmbient, 0.1
PROP_... = fresnelEXP, 5
PROP_... = fresnelMaxLevel, 1
PROP_... = fresnelC, 0.2
[REFRACTING_HEADLIGHT_0] ;折射灯 重要!
; ACTIVE = 0
SURFACE = '{ lod:A & g_BODY_EXT_SUB1 }', '{ lod:B & g_BODY_EXT_SUB6 }'
INSIDE = LIGHT_BEAM_1_SUB1, LIGHT_BEAM_2, front_light01, front_light02, front_light03
SYNC_EMISSIVE_AUTO = 1
ABSORPTION = 0.1
AMBIENT_MULT = 0.25
BASE_EMISSIVE_K = 0.01
BOUNCED_BACK_MULT = 0.4
BULB_BLUR_K = 2
BULB_REFLECTION_K = 1
CUSTOM_BULB_0 = 0.23, 0.504, 0.053, 0
CUSTOM_BULB_1 = 0.77, 0.5, 0.044, 0
CUSTOM_BULB_2 = 0.5, 0.5, 0, 0
CUSTOM_BULB_3 = 0.5, 0.5, 0, 0
DIFFUSE_MAP_FILTER_MULT = 0
DIFFUSE_MAP_MULT = 1
DIRECTION = 0, 0, -1
DYNAMIC_EMISSIVE_MAP = 0
EMISSIVE_MULT = 0.08
EXTRA_SIDE_THICKNESS = 0
F0 = 0.8
GLASS_COLOR = 0.25, 0.25, 0.25
GLASS_EMISSIVE_MULT = 0.1
GLASS_EXTRA_THICKNESS = 0.005
INNER_SPECULAR = 10
INNER_SPECULAR_EXP = 800
IOR = 1.5
IOR_FLYOUT_FLAT = 0
LOD_BIAS = 0
MIRROR_DIR = 1, 0, 0
MIRROR_POS = 0, 0.606615, 1.94062
NM_SHARE_EXT = 0
NM_SHARE_INT = 0.6
ORIGIN = 0.502155, 0.606615, 1.97821
RADIUS = 0.16523
REFLECTIVENESS_DIFFUSE_MULT = 10
REFLECTIVENESS_MULT = 10
REFLECTIVE_GAMMA = 0
SIDE_FALLOFF = 1
USE_COLORED_BULBS = 1
USE_CUSTOM_BULBS = 1
USE_NORMAL_ALPHA = 1
[SHADER_REPLACEMENT_...]
MESHES = g_BODY_EXT_SUB1
IS_TRANSPARENT = 0
[INCLUDE: common/materials_carpaint.ini]
CarPaintMaterial = Carpaint
CarPaintVersionAware = 4
DisableDev = 1
[Material_CarPaint_Metallic]
[INCLUDE: common/materials_glass.ini]
ExteriorGlassMaterials = Glass
; [Material_PhotoelasticGlass]
; Materials = CAR_Vetro_Fanali_ANTERIORI, CAR_Vetro_Fanali_POSTERIORI
; FilmIOR = 2.2
; ThicknessMult = 1
; Desaturate = 0
; MaskPass = 0
[INCLUDE: common/materials_license_plate.ini]
[Material_LicensePlate_Europe]
[INCLUDE: common/materials_interior.ini]
; [Material_InteriorPBR]
; Materials = INT_Skin_plastica_B
; UseLeatherDetails = 1
; HasDetailNormals = 1
; BrightnessAdjustment = 0.01
; LeatherDetailsScale = 1
; PROP_... = useDetail, 1
; [SHADER_REPLACEMENT_...]
; MATERIALS = Glass
; BLEND_MODE = OPAQUE
; IS_TRANSPARENT = 0
; SHADER = ksPerPixel
; PROP_... = ksAmbient, 0.3
; PROP_... = ksDiffuse, 0.3
[SIDE_NET_...]
MESHES = g_BODY_EXT_SUB3
MOVING_POINT = 0.0025, 1.63, -0.23
MOVING_POINT_EXP = 2
MOVING_POINT_RADIUS = 0.2
MAX_OFFSET = 0.03, 0.03, 0.01
SPRING_NEUTRAL = 10, 10, 50
SPRING_BOUNDARY = 100, 100, 100
DAMPENING = 0.92, 0.92, 0.92
FINAL_SCALE = 1, 1, 1
AIR_FACTOR = 1
AIR_WOBBLE_FACTOR = 1
AIR_WOBBLE_FREQUENCY = 1
[SHAKING_EXHAUST_...]
MESHES = g_BODY_EXT_SUB5, g_BODY_EXT_SUB6@A
POINT_0 = 0.42, 0.23, -2.21
POINT_0_RADIUS = 0.5
POINT_0_EXP = 1.5
; POINT_0_SCALE = 0.5, 1, 0
[SHADER_REPLACEMENT_...]
MATERIALS = INT_Vetro_interno
PROP_... = solidBrightnessAdjustment, -1
[ANIMATED_WIPER_0]
DEBUG = 0
MESHES = g_WIPER1, polymsh_detached3
UNDERLYING_SURFACE = g_BODY_EXT_SUB2
USE_MESH_FOR_TRACES = 1
GROUP_0 = 'polymsh_detached3@A=*'
GROUP_0_ANGLE_TO = 85
GROUP_0_ARM = 'g_WIPER1@A=2-4', 'g_WIPER1@B'
GROUP_0_ARM_END_WIPER_POS = 0
GROUP_0_AXIS = 0.131094, 0.817493, 0.560820
GROUP_0_AXIS_OFFSET_0 = 0.000000, 0.707107, 0.707107
GROUP_0_AXIS_OFFSET_1 = 0.000000, 0.707107, 0.707107
GROUP_0_BENDING_FROM = 0
GROUP_0_BENDING_TO = 0
GROUP_0_END = -0.051968, 0.928776, 0.873370
GROUP_0_PIVOT = 0.529655, 0.895061, 0.891522
GROUP_0_RUBBER_FROM = 0.386670, 0.918643, 0.844297
GROUP_0_RUBBER_OFFSET_AMOUNT = 0.0109
GROUP_0_RUBBER_OFFSET_POS = 0.421
GROUP_0_RUBBER_TO = -0.051222, 0.927470, 0.865002
GROUP_0_BASE = 'g_WIPER1@A=1'
GROUP_0_BASE_AXIS = 0.131094, 0.817493, 0.560820
GROUP_0_BASE_PIVOT = 0.529655, 0.895061, 0.890522
[ANIMATED_WIPER_1]
DEBUG = 0
MESHES = g_WIPER2, polymsh_detached2
UNDERLYING_SURFACE = g_BODY_EXT_SUB2
GROUP_0 = 'polymsh_detached2@A=4'
GROUP_0_ANGLE_TO = 95.0
GROUP_0_ARM = 'polymsh_detached2@A=1-3,5', 'g_WIPER2@A=2-4', g_WIPER2@B
GROUP_0_AXIS = 0.000000, 0.707107, 0.707107
GROUP_0_AXIS_OFFSET_0 = 0.000000, 0.707107, 0.707107
GROUP_0_AXIS_OFFSET_1 = 0.000000, 0.707107, 0.707107
GROUP_0_END = -0.402456, 0.939959, 0.872403
GROUP_0_PIVOT = 0.002, 0.8985, 0.932
GROUP_0_RUBBER_FROM = -0.139725, 0.925559, 0.878685
GROUP_0_RUBBER_OFFSET_AMOUNT = 0.0139
GROUP_0_RUBBER_OFFSET_POS = 0.369
GROUP_0_RUBBER_TO = -0.592416, 0.904447, 0.809874
GROUP_0_BASE = 'g_WIPER2@A=1'
GROUP_0_BASE_AXIS = 0.139840, 0.857977, 0.494287
[MESH_ADJUSTMENT_...]
MESHES = g_WIPER?, polymsh_detached3, polymsh_detached2
MOVE_TO = modelRoot:y
[BASIC]
DISABLE_WIPER_KSANIM = 1
;[MESH_SPLIT_...]
;MESHES = g_BODY_EXT_SUB2
;; @A - leBluem: whats this?
;MODE = COPY_FLIPPED
;SPLIT_MATERIAL = __interior_windows_rear
;; SPLIT_NAME = __interior_windows_rear
;INSERT_TO = COCKPIT_HR
[SHADER_REPLACEMENT_...]
MATERIALS = __interior_windows_rear
SHADER = ksWindscreen
PROP_... = bannerMode, 1 ; for those stripes at the back to look more presentable调试流程
配置检查
确认:
ext_config.ini 已正确加载
文件位于正确目录
INCLUDE 路径有效
对象检查
确认:
MATERIALS 名称正确
MESHES 名称正确
大小写一致
CSP 版本
部分功能依赖 CSP 版本
建议:
优先使用较新 CSP 版本
避免混用旧版参数写法
注意事项
覆盖逻辑
同一对象
→ 同一参数
→ 后加载配置覆盖前加载配置
MATERIALS、MESHES、NODES 匹配失败时,
对应配置不会生效。
兼容性
不同 CSP 版本之间:
参数可能变化
功能可能失效
部分 Section 行为存在差异
功能异常排查顺序:
对象匹配
→ 配置覆盖
→ 路径调用
→ CSP 版本
→ 参数兼容性
资源命名建议
推荐统一命名规范:
body_paint
glass_front
light_brake_l
carbon_trim
......
避免:
车漆
Glass!!!
Material#01
......
统一命名可降低:
匹配错误
配置冲突
后期维护成本