Divine Skins
Divine Skins Wiki

Bin & Particle Dictionary

Tài liệu tra cứu các thuộc tính bên trong file bin VFX của League of Legends, sắp xếp theo class thực sự sở hữu từng thuộc tính.

Viết bởi DAKA

Mọi trang khác trong mục này dạy bạn làm một việc gì đó. Trang này dành cho lúc bạn đang cuộn một bản dump .py, gặp một thuộc tính chưa từng thấy, và chỉ muốn biết nó là gì và nằm ở đâu.

Các mục được nhóm theo class sở hữu chúng, vì trong một bin cùng một tên có thể xuất hiện ở nhiều class, và việc bạn đang ở trong class nào quyết định giá trị đó làm gì.

Đọc cái này song song với Ruby

Phần lớn các thuộc tính này hiểu nhanh hơn khi bạn nghịch chúng thay vì đọc về chúng. Ruby xem trước VFX trên bất kỳ tướng nào và có sẵn trình sửa bin bên trong, nên bạn có thể đổi một giá trị rồi nhìn thẳng vào viewport thay vì đóng gói mod để xem nó làm gì.

Những tên này lấy từ đâu

Mọi class, thuộc tính và kiểu trên trang này đều được đọc từ chính bố cục class do engine đăng ký, đối chiếu với bản vá 16.16. Những tên trường không còn tồn tại đã bị loại bỏ, còn những tên nằm ở class khác với chỗ bạn tưởng thì được ghi rõ chúng thực sự ở đâu. Một vài hành vi được ghi chú ở chỗ engine làm khác với điều mà tên thuộc tính gợi ý.

Bạn có thể tìm dữ liệu cấu trúc ở đây lol-meta-classes. Bạn cũng có thể tìm tài liệu về các meta class và thuộc tính của chúng tại lol-meta-wiki.


Cách đọc một file bin

Một bin VFX là một cây. Xương sống của nó trông như sau:

VfxSystemDefinitionData              một hiệu ứng hoàn chỉnh, ví dụ recall hoặc chiêu Q
└── complexEmitterDefinitionData     danh sách emitter mà system sở hữu
    └── VfxEmitterDefinitionData     một emitter: một vệt, một tia sáng, vài tia lửa
        ├── primitive                thứ mà mỗi hạt vẽ ra
        └── các con trỏ *Definition  erosion, palette, distortion, con, ...

VfxSystemDefinitionData là vật chứa. Một thuộc tính không nằm trong system được phát trong lúc dùng kỹ năng sẽ không hiện ra trong lúc dùng kỹ năng đó.

Emitter là nơi bạn tốn nhiều thời gian nhất. Riêng nó mang 135 trường đã đăng ký, và treo hơn chục đối tượng sub-definition tùy chọn qua các con trỏ. Con trỏ rỗng nghĩa là cả tính năng đó bị tắt, đó là lý do xóa hẳn một khối thường là cách đúng để tắt một thứ gì đó.

Các lớp bọc giá trị

Thuộc tính số thường được bọc lại để engine có thể giữ chúng cố định hoặc cho chúng thay đổi:

rate: embed = ValueFloat {
    constantValue: f32 = 20
}

Các lớp bọc là ValueFloat, ValueColor, ValueVector2 và ValueVector3. Mỗi cái giữ một constantValue cộng thêm một con trỏ dynamics tùy chọn. Đây là hai trường riêng biệt, không phải hai cách viết của cùng một trường: hằng số luôn có mặt, còn dynamics là một đối tượng phụ treo lên nó.

KhóaNằm ởNó là gì
constantValuelớp bọcGiá trị được ghi. Kiểu theo lớp bọc: f32, vec4, vec2, vec3
dynamicslớp bọcCon trỏ tới đối tượng biến động. Rỗng nghĩa là dùng nguyên hằng số
timesđối tượng dynamicsCác vị trí dọc theo đường cong
valuesđối tượng dynamicsGiá trị tại mỗi mục tương ứng trong times
probabilityTablesđối tượng dynamicsNgẫu nhiên hóa theo từng hạt. Xem bên dưới
probabilityTables nhân lên, chứ không chọn

Bảng xác suất thường bị hiểu là "chọn ngẫu nhiên một trong các giá trị này". Không phải vậy. Mỗi bảng đưa một lần bốc ngẫu nhiên đều qua đường cong keyTimes tới keyValues của chính nó rồi trả về một hệ số nhân, sau đó áp vào constantValue. Lần bốc diễn ra một lần cho mỗi hạt, lúc sinh ra.

Vậy constantValue bằng 5 với một bảng trả về khoảng 0.5 đến 1 sẽ cho mỗi hạt một giá trị nằm giữa 2.5 và 5. Một bảng có keyValues vượt qua số không, ví dụ -1 đến 1, sẽ đảo dấu ở khoảng một nửa số hạt. Đó là lời giải thích quen thuộc cho hiệu ứng mà một số hạt trôi hoặc xoay ngược chiều với phần còn lại.

Lưu ý rằng keyTimes trong bảng xác suất là trục của lần bốc, không phải tuổi của hạt.

Thuộc tính lúc sinh và cặp đôi theo vòng đời

Nhiều thuộc tính đi theo cặp. Cái có birth* được tính một lần, khi hạt sinh ra. Cái đi cùng không có tiền tố tiếp tục tác động suốt vòng đời của hạt, và được nhân với giá trị lúc sinh chứ không thay thế nó.

Lúc sinhSuốt vòng đời
birthColorColor
birthScale0scale0
birthRotation0rotation0
birthVelocityvelocity
birthAccelerationacceleration
birthDragdrag

Nếu một giá trị trông sai mà chỉ có một nửa của cặp được ghi, hãy kiểm tra nửa còn lại trước khi đổi bất cứ thứ gì.

Đơn vị

Góc xoay và tốc độ xoay tính bằng độ và độ trên giây. Vòng đời, chu kỳ và độ trễ tính bằng giây. Tốc độ trôi UV tính bằng UV trên giây, còn xoay UV tính bằng độ. Các kênh màu chạy từ 0 đến 1.

Ngẫu nhiên hóa và hậu tố 0

Vài thuộc tính lúc sinh kết thúc bằng 0, như birthScale0 và birthRotation0. Đó là tàn dư đặt tên, không phải cặp nhỏ nhất và lớn nhất. Không có birthScale1 tương ứng trên class emitter hiện tại. Sự biến thiên theo từng hạt đến từ probabilityTables, như ở trên.

Các byte cờ

Nhiều giá trị boolean không phải là trường riêng. Chúng là các bit đơn lẻ được đóng gói vào các byte cờ dùng chung trên emitter. Công cụ dạng văn bản hiển thị từng cái một dưới dạng flag, nên bạn viết lần lượt, nhưng chúng nằm bốn hoặc tám cái trong một byte. Danh sách đầy đủ ở Cờ của emitter.


Cấp system

VfxSystemDefinitionData, vật chứa ngoài cùng. 33 trường đã đăng ký tính đến bản vá 16.16.

Thuộc tínhKiểuNó làm gì
particleNamestringTên dễ đọc của cả system. Đổi tên thoải mái, và đây là thứ đáng tin nhất để tìm khi hash của vật chứa chưa được giải
particlePathstringNhóm đường dẫn mà engine dùng để sắp xếp các system
complexEmitterDefinitionDatalist[embed]Các emitter mà system này sở hữu. Phần thân của hiệu ứng
simpleEmitterDefinitionDatalist[embed]Danh sách emitter cũ hơn. Vẫn còn trong các system legacy
materialOverrideDefinitionslist[embed]Ghi đè material ở cấp system. Emitter có danh sách cùng tên của riêng nó
transformmtx44Áp cho cả system, để phóng to, di chuyển và xoay toàn bộ như một khối. Xem Matrix Scaling
flagsu16Cờ bit ở cấp system. Hai cái đã biết: 0x100 chuyển vận tốc và drag sang lời giải dạng đóng, còn 0x800 là chế độ cấu hình thấp quyết liệt. Mặc định 212
mEyeCandyboolĐánh dấu system là hiệu ứng trang trí, nên nó biến mất khi người chơi bật Ẩn hiệu ứng trang trí
buildUpTimef32Khoảng khởi động của system
visibilityRadiusf32Bán kính culling
overrideScaleCapoption[f32]Giới hạn mức phóng to tối đa của system
scaleDynamicallyWithAttachedBoneboolTỉ lệ system bám theo xương mà nó gắn vào
objectPathhashĐịnh danh đường dẫn đối tượng. Thêm vào ở bản vá 16.16
drawingLayeru8System vẽ vào lớp nào
ClockToUseu8Đồng hồ nào điều khiển thời gian của system
selfIlluminationf32Mức tự phát sáng
assetRemappingTablelist[embed]Các ánh xạ lại asset áp dụng trong system
soundOnCreateDefaultstringÂm thanh phát khi system được tạo
voiceOverOnCreateDefaultstringLời thoại phát khi tạo
soundPersistentDefaultstringÂm thanh lặp suốt vòng đời system
mEyeCandy là thuộc tính của system

Nó nằm trên VfxSystemDefinitionData chứ không phải emitter, nên nó thuộc về phần cấp system của khối chứ không nằm cạnh các thiết lập render của emitter.


Emitter: danh tính và vòng đời

VfxEmitterDefinitionData. Mọi thứ từ đây đến Cờ của emitter đều thuộc class này trừ khi một dòng nói khác.

Thuộc tínhKiểuNó làm gì
emitterNamestringTên dễ đọc của một emitter. Đổi tên thoải mái, và rất nên làm
disabledboolTắt emitter mà không xóa nó
importanceu8Độ ưu tiên khi cắt bớt theo chất lượng, đối chiếu với thiết lập video Chất lượng hiệu ứng. Xem bảng bên dưới. Mặc định 2
particleLifetimeValueFloatMỗi hạt sống bao lâu sau khi được phát ra. Mặc định 3.0 nếu vắng mặt. -1 là giá trị canh, xem cảnh báo bên dưới
lifetimeoption[f32]Bản thân emitter chạy bao lâu
particleLingeroption[f32]Số giây thêm mà các hạt còn hiện sau khi emitter kết thúc. Nếu vắng mặt thì mặc định là particleLifetime + 10, không phải không
emitterLingeroption[f32]Số giây thêm mà chính emitter còn nán lại
particleLingerTypeu8Hành vi nán lại nào được dùng
LingerpointerMột VfxLingerDefinitionData, cho kiểu nán lại có thay đổi hạt chứ không chỉ trì hoãn việc biến mất
flexParticleLifetimepointerGhi đè flex cho vòng đời hạt
particleLifetime -1 mang hai nghĩa trái ngược

-1 không có nghĩa là "hạt vô hạn". Nó có nghĩa là "sống cho tới khi emitter dừng", và điều đó cho ra kết quả gì thì phụ thuộc hoàn toàn vào isSingleParticle.

Khi bật isSingleParticle, phần giới hạn cửa sổ phát bị bỏ qua, nên cửa sổ không bị chặn, emitter không bao giờ kết thúc, và hạt tồn tại vô thời hạn. Đây là cách dựng một vật trang trí gắn vĩnh viễn.

Không có isSingleParticle, nhánh giới hạn không bao giờ chạy và cửa sổ phát giữ nguyên ở lifetime đã ghi. Emitter dừng ở đó và mang theo các hạt của nó, nên một -1 liên tục sẽ biến mất thay vì tồn tại tiếp.

Một giá trị 9999 được ghi ra cũng hành xử y hệt -1.

importance cắt bớt như thế nào

importance được đối chiếu với thiết lập Chất lượng hiệu ứng của người chơi khi system dựng các emitter của nó. Đây là một hạng mục, không phải một thang đo, và hai trong số các giá trị hành xử khác với điều mà tên gọi gợi ý.

Chất lượng hiệu ứngCác giá trị importance bị bỏ qua
0 đến 1, Rất thấp và Thấp0, 1, 5
2, Trung bình0, 1
3, Cao0, 4
4, Rất cao4

Vậy 0 đến 3 tăng dần độ ưu tiên, và 3 là thiết yếu cho lối chơi nên không bao giờ bị cắt. 4 là bản thay thế chất lượng thấp chỉ hiện ở thiết lập thấp, còn 5 thì ngược lại, chỉ hiện từ Trung bình trở lên. Ghép một emitter 4 với một emitter 5 là cách một hiệu ứng xuất xưởng hai phiên bản của chính nó.

Bốn thứ khác quyết định emitter có tồn tại hay không: disabled, colorblindVisibility, ChanceToNotExist, và bit 0x800 trong flags của system, vốn lược bỏ mọi thứ trừ importance 3 và 4.

rate, lifetime, particleLifetime và particleLinger được minh họa bằng ảnh chụp màn hình trên trang Emitter Library.


Emitter: phát và nhịp thời gian

Thuộc tínhKiểuNó làm gì
rateValueFloatSố hạt phát ra mỗi giây. Trên emitter có isSingleParticle thì nó đặt số lượng hạt thay vì tốc độ
flexRatepointerGhi đè flex cho tốc độ
rateByVelocityFunctionValueVector2Điều chỉnh tốc độ theo mức độ di chuyển nhanh chậm của emitter
MaximumRateByVelocityoption[f32]Giới hạn trên cho mục ở trên
timeBeforeFirstEmissionf32Độ trễ trước khi có gì đó sinh ra. Hữu ích để rải một system thành nhiều giai đoạn
periodoption[f32]Độ dài một chu kỳ phát
timeActiveDuringPeriodoption[f32]Trong mỗi period, emitter thực sự phát trong bao lâu
ChanceToNotExistf32Xác suất emitter bị bỏ qua hoàn toàn lúc sinh ra
SpawnShapepointerMột IVfxShape cho biết khối không gian mà các hạt sinh ra bên trong
FlexShapeDefinitionpointerBiến thể flex của hình dạng sinh
emissionSurfaceDefinitionpointerSinh ra trên một bề mặt thay vì trong một khối
emissionMeshNamestringMột mesh dùng làm hình dạng phát
emissionMeshScalef32Phóng to thu nhỏ mesh phát đó
period và timeActiveDuringPeriod là cách tạo loạt phát

Đặt period bằng độ dài chu kỳ và timeActiveDuringPeriod bằng một giá trị ngắn hơn, emitter sẽ phát theo nhịp thay vì chạy liên tục. Để trống cả hai sẽ cho một dòng đều đặn.


Emitter: vị trí và hướng

Thuộc tínhKiểuNó làm gì
EmitterPositionValueVector3Các hạt sinh ra ở đâu so với gốc của emitter. Y dương là hướng lên
translationOverridevec3Dịch chuyển cả emitter
rotationOverridevec3Xoay cả emitter
scaleOverridevec3Phóng to thu nhỏ cả emitter
FlexInstanceScalepointerGhi đè flex cho tỉ lệ của thực thể
bindWeightValueFloatHạt bám theo thứ nó gắn vào tới mức nào. 1 bám hoàn toàn, 0 bỏ nó lại trong không gian thế giới
postRotateOrientationAxisvec3Trục dùng khi bật hasPostRotateOrientation
offsetLifetimeScalingvec3Điều chỉnh vòng đời của hạt theo khoảng cách nó sinh ra so với emitter, theo từng trục
offsetLifeScalingSymmetryModeu8Chế độ đối xứng cho mục ở trên
EmitterPosition hay translationOverride?

EmitterPosition dịch chỗ các hạt sinh ra bên trong emitter. translationOverride dịch cả emitter. Nếu một emitter sai chỗ thì dùng cái thứ hai; nếu các hạt sai chỗ bên trong một emitter vốn đã đúng thì dùng cái thứ nhất.


Emitter: thuộc tính lúc sinh

Trạng thái mà hạt nhận được ngay khi sinh ra. Mọi thứ tên birth* đều là điều kiện ban đầu, không phải điều kiện liên tục.

Thuộc tínhKiểuNó làm gì
birthColorValueColorMàu ban đầu, RGBA
birthScale0ValueVector3Kích thước ban đầu
birthRotation0ValueVector3Góc xoay ban đầu
birthRotationalVelocity0ValueVector3Tốc độ quay ban đầu
birthRotationalAccelerationValueVector3Gia tốc quay ban đầu
birthVelocityValueVector3Vận tốc ban đầu
birthAccelerationValueVector3Gia tốc ban đầu
birthDragValueVector3Drag ban đầu
birthOrbitalVelocityValueVector3Xoay quanh quỹ đạo. Xem cảnh báo bên dưới
birthFrameRateValueFloatTốc độ phát ban đầu cho texture động
birthUVOffsetValueVector2Độ lệch ban đầu trong texture. Hữu ích để làm lệch pha các hạt dùng chung một sheet
birthUvScrollRateValueVector2Tốc độ trôi UV ban đầu
birthUvRotateRateValueFloatTốc độ xoay UV ban đầu

Mỗi cái đều có một người anh em flex* (flexBirthVelocity, flexBirthUVOffset, flexScaleBirthScale và tương tự) ghi đè nó khi có giá trị flex được cung cấp.

birthOrbitalVelocity không thêm vận tốc nào cả

Dù mang cái tên đó, nó không đóng góp gì vào vận tốc của hạt. Nó chỉ liên quan tới phép biến đổi: nó xoay ma trận riêng của hạt trong khi vị trí được lưu vẫn tiếp tục tiến theo birthVelocity và các lực mà thôi.

Điều này quan trọng nếu bạn đang suy luận về quãng đường một hạt đi được. Coi nó như vận tốc tiếp tuyến cộng thêm vào phép xoay sẽ đếm chuyển động hai lần và cho ra đúng gấp đôi chiều dài quãng đường.


Emitter: chuyển động theo vòng đời

Trong khi birth* đặt trạng thái ban đầu, những cái này tiếp tục tác động.

Thuộc tínhKiểuNó làm gì
velocityValueVector3Vận tốc suốt vòng đời của hạt
accelerationValueVector3Gia tốc suốt vòng đời
worldAccelerationIntegratedValueVector3Gia tốc trong không gian thế giới bất kể hướng của hạt. Trọng lực nằm ở đây, dưới dạng Y âm
dragValueVector3Drag suốt vòng đời
scale0ValueVector3Tỉ lệ suốt vòng đời, nhân với birthScale0
rotation0IntegratedValueVector3Góc xoay suốt vòng đời
directionVelocityScalef32Hạt kéo dài theo hướng di chuyển bao nhiêu khi tốc độ tăng. Dùng cùng isDirectionOriented
directionVelocityMinScalef32Mức sàn của độ kéo dài đó
fieldCollectionDefinitionpointerTrường lực. Xem Trường lực

Emitter: màu sắc

Thuộc tínhKiểuNó làm gì
birthColorValueColorMàu lúc sinh ra
ColorValueColorMàu suốt vòng đời của hạt, nhân với birthColor. Mặc định trắng
colorLookUpTypeX / colorLookUpTypeYu8Thứ điều khiển từng trục khi tra particleColorTexture, ví dụ tuổi của hạt
colorLookUpScalesvec2Hệ số áp lên các tọa độ tra đó. Mặc định 1, 1
colorLookUpOffsetsvec2Độ lệch áp lên các tọa độ tra đó
colorRenderFlagsu8Các cờ bit ảnh hưởng tới cách màu được áp lúc render
modulationFactorvec4Điều biến áp lên màu cuối cùng
censorModulateValuevec4Màu dùng khi nội dung bị kiểm duyệt cho một khu vực
paletteDefinitionpointerMột VfxPaletteDefinitionData. Xem Palette
colorblindVisibilityu80 luôn hiện, 1 chỉ ở chế độ thường, 2 chỉ ở chế độ mù màu

Đọc một giá trị RGBA

birthColor: embed = ValueColor {
    constantValue: vec4 = { 1, 0.7059, 0, 1 }
}

Các kênh chạy từ 0 đến 1 chứ không phải 0 đến 255. Để quy đổi, chia cho 255. Kênh xanh lá ở trên là 180, và 180 / 255 cho ra 0.7059.

Giá trị thứ tư là alpha, trong đó 0 là trong suốt hoàn toàn và 1 là đục hoàn toàn.

Để đổi màu trong thực tế, Quartz tính hộ bạn.


Emitter: texture và UV

Thuộc tínhKiểuNó làm gì
texturestringFile .dds hoặc .tex mà emitter vẽ. Xem File Formats
particleColorTexturestringDải gradient được lấy mẫu để tô màu hạt, thường là theo vòng đời của chúng. Được nhắm bởi các trường colorLookUp*
falloffTexturestringTexture dốc suy giảm
textureMultpointerMột VfxTextureMultDefinitionData, không phải một chuỗi đơn thuần. Xem Texture mult
texDivvec2Chia texture thành lưới, dùng cho hoạt ảnh dạng sheet
startFrameu16Khung đầu tiên của một sheet động
numFramesu16Sheet chứa bao nhiêu khung
frameRatef32Các khung đó chạy nhanh cỡ nào
uvModeu8Cách tọa độ UV được diễn giải
texAddressModeBaseu8Lặp, clamp hay soi gương cho texture nền
uvRotationValueFloatXoay texture
uvScaleValueVector2Phóng to thu nhỏ texture
uvTransformCentervec2Tâm xoay cho phép xoay và phóng UV
uvParallaxScalef32Mức thị sai trên UV
emitterUvScrollRatevec2Tốc độ trôi áp theo emitter
particleUVScrollRateIntegratedValueVector2Tốc độ trôi áp theo từng hạt
particleUVRotateRateIntegratedValueFloatTốc độ xoay áp theo từng hạt
isTexturePixelatedboolLấy mẫu điểm gần nhất thay vì lọc mượt
Không có scrollRate đơn thuần

Việc trôi luôn được giới hạn theo thứ mà nó tác động. Trên emitter hiện đại các trường là birthUvScrollRate, emitterUvScrollRate và particleUVScrollRate. Một uvScrollRate trần chỉ tồn tại trên class legacy được mô tả ở Mô hình component legacy.


Emitter: trạng thái render

Thuộc tínhKiểuNó làm gì
blendModeu8Hạt hòa trộn với thứ phía sau nó ra sao. Bảng đầy đủ bên dưới
miscRenderFlagsu8Các bit trạng thái độ sâu và hòa trộn. Xem cảnh báo bên dưới
meshRenderFlagsu8Cờ render cho primitive dạng mesh
colorRenderFlagsu8Cờ render ảnh hưởng tới màu
passi16Thứ tự vẽ. Thấp hơn thì vẽ trước và nằm dưới
renderPhaseOverrideu8Ép emitter vào một pha render cụ thể. Mặc định 7, tức là không ghi đè
depthBiasFactorsvec2Đẩy nhẹ độ sâu để các bề mặt đồng phẳng không tranh nhau
DepthPushPullf32Đẩy hoặc kéo hạt dọc theo độ sâu. Mặc định 0. Shader gọi nó là PARTICLE_DEPTH_PUSH_PULL
alphaRefu8Ngưỡng kiểm tra alpha, 0 đến 255. Pixel thấp hơn bị loại. Mặc định 5
stencilModeu8Hành vi stencil
stencilRefu8Giá trị tham chiếu stencil
StencilReferenceIdhashTham chiếu stencil có tên
disableBackfaceCullboolVẽ cả hai mặt của mỗi bề mặt
softParticleParamspointerMột VfxSoftParticleDefinitionData. Xem Soft particles
sliceTechniqueRangef32Tầm của kỹ thuật slice
CustomMaterialpointerMột VfxMaterialDefinitionData thay cho material mặc định
materialOverrideDefinitionslist[embed]Ghi đè theo từng material cho emitter này
FilteringpointerMột VfxEmitterFiltering, kiểm soát nơi emitter được phép hiện
AudiopointerMột VfxEmitterAudio

Các giá trị blendMode

Chúng cố định và giống nhau cho mọi primitive. Mỗi chế độ chọn một hệ số hòa trộn nguồn và đích cùng một phép hòa trộn.

Chế độSrcDestPhépGhi độ sâuHòa trộn
0ONEONEADDkhôngcó
1SRC_ALPHAINV_SRC_ALPHAADDkhôngcó
2ZEROINV_SRC_COLORADDkhôngcó
3cókhông
4SRC_ALPHAONEADDkhôngcó
5ONEINV_SRC_ALPHAADDkhôngcó
6ONEONEMINkhôngcó
7ONEONEMAXkhôngcó
8INV_DEST_ALPHADEST_ALPHAADDkhôngcó

Đọc bảng đó trong thực tế:

  • 0 và 4 là các chế độ cộng. Màu đen không đóng góp gì, nên đây là những chế độ an toàn để đổi màu về phía đen.
  • 1 là hòa trộn alpha tiêu chuẩn, thứ gần nhất với cái gọi là "bình thường".
  • 2 làm tối đi, vì nó nhân với nghịch đảo của màu nguồn.
  • 3 là chế độ đục. Đây là chế độ duy nhất ghi độ sâu và cũng là chế độ duy nhất không hòa trộn gì cả.
  • 6 và 7 lấy giá trị nhỏ nhất hoặc lớn nhất giữa nguồn và đích thay vì cộng.
Bit 0 của miscRenderFlags tắt kiểm tra độ sâu, theo chiều ngược

Bit 0 tương ứng với DepthEnable trong trạng thái depth-stencil, và nó đảo ngược: khi bit được bật, kiểm tra độ sâu bị tắt. Đặt miscRenderFlags bằng 1 chính là thứ khiến một hạt vẽ xuyên qua hình khối.

Đây không phải cờ lật mặt, và cách hiểu rằng giá trị 4 tắt việc ghi độ sâu mà vẫn giữ phần kiểm tra là không đúng. Việc ghi độ sâu do blendMode quyết định, và chỉ chế độ 3 bật nó.

Phép so sánh được dùng là LESS_EQUAL chứ không phải LESS, và đó là điều cho phép một decal đồng phẳng trên mặt đất hiện lên được.


Cờ của emitter

Bốn byte trên emitter, mỗi byte mang tối đa tám bit có tên. Công cụ dạng văn bản hiển thị từng cái một dưới dạng flag.

CờNó làm gì
TextureFlipU / TextureFlipVLật gương texture theo từng trục
particleIsLocalOrientationHướng của hạt được đọc trong không gian cục bộ
isLocalOrientationHướng của emitter được đọc trong không gian cục bộ
isDirectionOrientedCác hạt xoay theo hướng di chuyển của chúng
isUniformScaleTỉ lệ bị khóa về một giá trị duy nhất cho mọi trục
hasPostRotateOrientationÁp postRotateOrientationAxis sau khi xoay
isRandomStartFrameMỗi hạt bắt đầu ở một khung ngẫu nhiên của sheet
doesCastShadowEmitter góp phần tạo bóng
isRotationEnabledBật phép xoay nói chung
uvScrollClampClamp việc trôi UV thay vì cho lặp vòng
isFollowingTerrainCác hạt bám theo độ cao địa hình
isGroundLayerVẽ như một lớp mặt đất
useEmissionMeshNormalForBirthCác hạt bay ra dọc theo pháp tuyến của mesh phát
useNavmeshMaskChe hiệu ứng theo địa hình để nó không tràn qua tường
ParticlesShareRandomValueMọi hạt bốc cùng một giá trị ngẫu nhiên
SortEmittersByPosSắp xếp các emitter theo vị trí
IsEmitterSpaceCác hạt được mô phỏng trong không gian emitter thay vì không gian thế giới
HasVariableStartTimeThời điểm bắt đầu khác nhau theo từng hạt
isSingleParticleĐúng một hạt thay vì một dòng liên tục
doesParticleLifetimeScaleVòng đời hạt co giãn theo system
doesLifetimeScaleVòng đời emitter co giãn theo system
WriteAlphaOnlyChỉ ghi kênh alpha

Primitive

primitive là một con trỏ quyết định mỗi hạt vẽ ra cái gì. Để trống sẽ cho quad billboard hướng về camera mặc định.

ClassNó vẽ gì
VfxPrimitiveCameraQuadMột quad phẳng luôn hướng về camera. Mặc định, và là phần lớn các hạt bạn gặp
VfxPrimitiveCameraUnitQuadMột quad hướng về camera ở kích thước đơn vị
VfxPrimitiveArbitraryQuadMột quad có hướng cố định, không hướng về camera
VfxPrimitiveMeshMột mesh
VfxPrimitiveAttachedMeshMột mesh gắn vào xương. Thêm UseAvatarSpecificSubmeshMask
VfxPrimitiveCameraTrailMột vệt hướng về camera
VfxPrimitiveArbitraryTrailMột vệt có hướng cố định
VfxPrimitiveRibbonMột dải ruy băng
VfxPrimitiveBeamMột chùm nối hai điểm
VfxPrimitiveCameraSegmentBeamMột chùm chia đoạn hướng về camera
VfxPrimitiveCameraSegmentSeriesBeamMột chuỗi chùm chia đoạn
VfxPrimitiveLaserMột tia laser
VfxPrimitivePlanarProjectionChiếu texture lên một mặt phẳng. Decal trên mặt đất
VfxPrimitiveRayMột tia
VfxPrimitiveNonRenderableKhông vẽ gì cả. Dùng cho các emitter chỉ tồn tại để sinh con hoặc chạy logic

Các trường mesh

Primitive dạng mesh mang một VfxMeshDefinitionData trong mMesh. Chú ý tiền tố m: chúng không viết giống các trường riêng của emitter.

Thuộc tínhKiểuNó làm gì
mMeshNamestringMesh cần vẽ
mMeshSkeletonNamestringBộ xương cho mesh có hoạt ảnh
mSimpleMeshNamestringMột mesh đơn giản .scb hoặc .sco
mSubmeshesToDrawlist[string]Những submesh nào được render
mSubmeshesToDrawAlwayslist[string]Những submesh luôn được render
mLockMeshToAttachmentboolKhóa mesh vào điểm gắn của nó
mAnimationNamestringHoạt ảnh chạy trên mesh
mAnimationVariantslist[string]Các hoạt ảnh thay thế

Primitive dạng mesh cũng mang AlignPitchToCamera và AlignYawToCamera trên VfxPrimitiveMeshBase.

Các loại file mesh

Phần mở rộngNó là gì
.scbMesh tĩnh, nhị phân
.scoMesh tĩnh, văn bản ASCII, mang joint và material
.sknMesh đã rig, chuẩn cho model tướng
.sklBộ xương đi kèm với một .skn

Một cặp .skn và .skl trong thư mục particle nghĩa là một mesh có hoạt ảnh. Xem Meshes as Particles.

Vệt và ruy băng

VfxPrimitiveTrailBase mang một VfxTrailDefinitionData trong mTrail:

Thuộc tínhKiểuNó làm gì
mBirthTilingSizeValueVector3Kích thước lát lúc sinh
mCutofff32Chiều dài cung mà tại đó vệt ngừng được kéo dài
mMaxAddedPerFramei32Giới hạn số điểm thêm vào mỗi khung hình
mSmoothingModeu8Cách làm mượt dọc theo vệt
mModeu8Chế độ của vệt

VfxRibbonDefinitionData mang birthTilingSize dưới dạng ValueVector2.


Các class sub-definition

Mỗi cái treo trên một con trỏ ở emitter. Rỗng nghĩa là tính năng bị tắt hoàn toàn.

Texture mult

VfxTextureMultDefinitionData. Một texture thứ hai nhân lên trên texture nền, đúng ý tưởng của Multiply trong phần mềm chỉnh ảnh. Trường textureMult của emitter trỏ tới đối tượng này, còn tên file thật là chuỗi textureMult nằm bên trong nó.

Thuộc tínhKiểuNó làm gì
textureMultstringTexture dùng để nhân
texDivMultvec2Chia lưới cho texture nhân
texAddressModeMultu8Chế độ lặp
uvScaleMultValueVector2Tỉ lệ trên UV của phần nhân
UvRotationMultValueFloatXoay trên UV của phần nhân
uvTransformCenterMultvec2Tâm cho phép xoay và phóng đó
birthUvScrollRateMultValueVector2Tốc độ trôi lúc sinh
emitterUvScrollRateMultvec2Tốc độ trôi theo emitter
birthUVOffsetMultValueVector2Độ lệch UV ban đầu
birthUvRotateRateMultValueFloatTốc độ xoay UV ban đầu
ParticleIntegratedUvScrollMultIntegratedValueVector2Trôi theo từng hạt
ParticleIntegratedUvRotateMultIntegratedValueFloatXoay theo từng hạt

Byte cờ của nó mang uvScrollAlphaMult, uvScrollClampMult, TextureMultFilpU, TextureMultFilpV và isRandomStartFrameMult. Hai cái cuối đúng là được viết như vậy trong engine, nên hãy tìm "Filp" chứ đừng tìm "Flip" khi bạn đi lùng chúng.

Palette

VfxPaletteDefinitionData. Tô màu hạt bằng cách lấy mẫu từ một texture gradient thay vì dùng một giá trị phẳng.

Thuộc tínhKiểuNó làm gì
paletteTexturestringẢnh gradient
PaletteTextureAddressModeu8Chế độ lặp cho gradient
paletteSelectorValueVector3Lấy mẫu ở chỗ nào trong bảng màu
palleteSrcMixColorValueColorMàu trộn với kết quả lấy mẫu
PaletteUAnimationCurveValueFloatTạo hoạt ảnh cho tọa độ U
PaletteVAnimationCurveValueFloatTạo hoạt ảnh cho tọa độ V
paletteCounti32Số bảng màu trong texture
Palette hay Pallete?

Class và hầu hết các trường dùng cách viết đúng. Lỗi chính tả của chính engine chỉ sống sót ở đúng một trường, palleteSrcMixColor, nên tìm "pallete" trong một bin sẽ bỏ sót gần như mọi thứ. Hãy tìm "palette".

Erosion alpha

VfxAlphaErosionDefinitionData. Hòa tan hạt bằng một map. Gần như mọi hiệu ứng cháy rụi hay xóa dần đều được dựng theo cách này.

Thuộc tínhKiểuNó làm gì
erosionMapNamestringTexture erosion
erosionMapAddressModeu8Chế độ lặp cho map
erosionMapChannelMixerValueColorNhững kênh nào của map được dùng, và dùng bao nhiêu
erosionDriveCurveValueFloatQuá trình erosion tiến triển ra sao
erosionDriveSourceu8Thứ điều khiển nó, ví dụ tuổi của hạt
erosionFeatherIn / erosionFeatherOutf32Độ mềm ở mỗi mép của ranh giới
erosionSliceWidthf32Bề rộng của dải đang bào mòn
LingerErosionDriveCurveValueFloatMột đường cong riêng dùng trong lúc nán lại
UseLingerErosionDriveCurveboolBật đường cong riêng đó

Map erosion thường ở dạng xám, trong đó màu trắng mòn trước và màu đen mòn sau cùng. Map nhiều kênh mang một hoa văn độc lập trên mỗi kênh màu, và erosionMapChannelMixer chọn giữa chúng.

Distortion

VfxDistortionDefinitionData. Làm méo thứ được vẽ phía sau hạt. Sóng xung kích và gợn nhiệt.

Thuộc tínhKiểuNó làm gì
normalMapTexturestringNormal map điều khiển phần méo
distortionf32Cường độ
distortionModeu8Chế độ distortion nào được dùng

Phản chiếu và fresnel

VfxReflectionDefinitionData. Khối viền sáng và phản chiếu. fresnel nằm ở đây, không phải trên emitter.

Thuộc tínhKiểuNó làm gì
reflectionMapTexturestringMap phản chiếu
reflectionOpacityDirectf32Cường độ phản chiếu khi nhìn thẳng
reflectionOpacityGlancingf32Cường độ phản chiếu ở góc xiên
reflectionFresnelf32Thành phần fresnel cho phản chiếu
reflectionFresnelColorvec4Màu của thành phần đó
fresnelf32Cường độ fresnel, viền sáng ở góc xiên
fresnelColorvec4Màu của viền sáng đó

Soft particles

VfxSoftParticleDefinitionData. Làm mềm đường cắt gắt ở chỗ hạt cắt qua hình khối.

Thuộc tínhKiểuNó làm gì
beginInf32Độ lệch trước khi bắt đầu mờ vào trong
beginOutf32Độ lệch trước khi bắt đầu mờ ra ngoài
deltaInf32Quãng mà phần mờ vào trong bao phủ
deltaOutf32Quãng mà phần mờ ra ngoài bao phủ

Còn một byte chế độ thứ năm chọn xem phần mờ nào trong hai phần được áp dụng. Một con trỏ softParticleParams rỗng sẽ tắt hẳn tính năng, và không có trường bật tắt riêng nào cả.

Linger

VfxLingerDefinitionData. Thay đổi hạt trong giai đoạn nán lại thay vì chỉ trì hoãn việc xóa nó.

Thuộc tínhKiểuNó làm gì
LingerRotationValueVector3Góc xoay áp trong lúc nán lại
LingerScaleValueVector3Tỉ lệ áp trong lúc nán lại
KeyedLingerVelocityValueVector3Vận tốc trong lúc nán lại
KeyedLingerAccelerationValueVector3Gia tốc trong lúc nán lại
KeyedLingerDragValueVector3Drag trong lúc nán lại
SeparateLingerColorValueColorMột màu khác trong lúc nán lại

Mỗi cái có một cờ Use* tương ứng: UseLingerRotation, UseLingerScale, UseKeyedLingerVelocity, UseKeyedLingerAcceleration, UseKeyedLingerDrag và UseSeparateLingerColor. Đặt giá trị mà không bật cờ thì chẳng có tác dụng gì.

Material và driver

VfxMaterialDefinitionData giữ một liên kết Material và một map materialDrivers. Các driver tạo hoạt ảnh cho một tham số material thay vì giữ nó cố định.

ClassNó làm gì
VfxColorOverLifeMaterialDriverĐiều khiển một màu suốt vòng đời của hạt
VfxFloatOverLifeMaterialDriverĐiều khiển một float đơn suốt vòng đời
VfxSineMaterialDriverDao động một giá trị theo hình sin, để tạo nhịp

Về phần glow và toon shader, xem Static Materials.


Trường lực

VfxFieldCollectionDefinitionData, truy cập qua fieldCollectionDefinition của emitter. Trong khi birthVelocity đẩy một hạt vào chuyển động, một trường lực tiếp tục tác động lên nó.

Thuộc tínhKiểuNó làm gì
fieldAccelerationDefinitionslist[embed]Gia tốc không đổi, ví dụ trọng lực
fieldAttractionDefinitionslist[embed]Kéo các hạt về một điểm
fieldDragDefinitionslist[embed]Làm chậm các hạt
fieldNoiseDefinitionslist[embed]Thêm nhiễu động
fieldOrbitalDefinitionslist[embed]Xoay các hạt quanh một trục

Hình dạng phát

SpawnShape trỏ tới một IVfxShape.

ClassNó làm gì
VfxShapeSphereSinh ra bên trong một hình cầu, với một radius
VfxShapeBoxSinh ra bên trong một hình hộp
VfxShapeCylinderSinh ra bên trong một hình trụ
VfxShapeVolumeHành vi khối dùng chung, mang flags của riêng nó
VfxShapeLegacyHệ hình dạng cũ hơn, vẫn còn trên nhiều hiệu ứng

VfxEmissionMeshData lo phần sinh ra từ một mesh, với meshName, skeletonName, AnimationName, meshScale, maxJointWeights, Submeshes và useSurfaceNormalForBirthPhysics.


Hạt con

VfxChildParticleSetDefinitionData, truy cập qua childParticleSetDefinition của emitter. Đây là cách một vệt bắn ra tia lửa hoặc một vụ nổ văng ra mảnh vỡ.

Thuộc tínhKiểuNó làm gì
childrenIdentifierslist[embed]Các system con cần sinh ra, dưới dạng các mục VfxChildIdentifier
boneToSpawnAtlist[string]Các xương mà hạt con sinh ra trên đó
childrenProbabilityValueFloatXác suất một hạt con được sinh ra
childEmitOnDeathboolSinh hạt con khi hạt cha chết chứ không phải khi nó sinh ra
ParentInheritanceDefinitionpointerMột VfxParentInheritanceParams quyết định hạt con thừa hưởng những gì

VfxChildIdentifier giữ effect (một liên kết), effectKey (một hash) và effectName (một chuỗi).

VfxParentInheritanceParams giữ Mode và RelativeOffset. Độ lệch đó là một kênh tương đối so với hạt cha đúng nghĩa, tách biệt với EmitterPosition của chính hạt con.

Hạt con sinh ra một lần, lúc chào đời

Không có luồng cấp liên tục từ cha sang con. Một system con được tạo đúng một lần, vào thời điểm hạt mang nó sinh ra, và từ đó trở đi chạy như một system độc lập theo đồng hồ riêng. Thứ duy nhất tháo dỡ nó là cái chết của hạt mang.

Một hệ quả đáng biết: với một hạt mang có isSingleParticle thì có đúng một hạt và do đó đúng một lần tạo con, và việc cửa sổ phát của hạt cha đóng lại không thể ngăn điều đó.

Thừa hưởng là một mode, không phải chuỗi cố định

Việc hạt con thừa hưởng gì từ hạt cha do giá trị Mode trên VfxParentInheritanceParams quyết định. Khi không có ParentInheritanceDefinition nào được ghi, hạt con chạy theo mode mặc định. Bất kỳ mô hình tư duy nào giả định một tập cố định các thứ được thừa hưởng sẽ đúng với mặc định và sai với phần còn lại.

Các system con lồng nhau, và engine duyệt chúng theo chiều sâu trước, nên một tổ hợp lồng ba tầng sẽ hợp thành ở mọi tầng.

Một mẫu hay gặp là emitter cha dùng VfxPrimitiveNonRenderable: nó không vẽ gì cả và chỉ tồn tại để đặt vị trí cho các hạt con của nó.


Mô hình component legacy

Các hiệu ứng cũ hơn dùng một mô hình emitter thứ hai dựa trên component, vẫn còn đi kèm trong engine. Bạn sẽ gặp nó ở những tướng ra mắt đã lâu. Nó được ghi lại ở đây để bạn nhận ra nó, chứ không phải để bạn viết đồ mới bằng nó.

ClassKích cỡVai trò
VfxEmitterLegacySimple13 trườngEmitter legacy đơn giản, truy cập qua con trỏ LegacySimple của emitter
VfxLegacyRenderComponent66 trườngTrạng thái render legacy
VfxLegacyPhysicsComponent37 trườngChuyển động và vị trí legacy
VfxLegacyLifetimeComponent17 trườngNhịp thời gian legacy
VfxLegacyGeometryComponent1 trườngHình học legacy

Nhiều tên xuất hiện ở cả hai mô hình. blendMode, texture, bindWeight, birthVelocity, particleLifetime và những cái khác tồn tại trên emitter hiện đại và trên một component legacy, ở các offset khác nhau. Khi một giá trị có vẻ không có tác dụng, hãy kiểm tra xem bạn đang thực sự sửa cái nào trong hai cái.

Ba cái tên chỉ tồn tại duy nhất trên mô hình legacy:

Thuộc tínhKiểuNằm ở
uvScrollRatevec2VfxEmitterLegacySimple
particleBindvec2VfxEmitterLegacySimple
lockedToEmitterboolVfxEmitterLegacySimple

VfxEmitterLegacySimple cũng mang birthScale, scale, birthRotation, birthRotationalVelocity, rotation, scaleBias, orientation, fixedOrbitType, hasFixedOrbit và scaleUpFromOrigin. Chú ý birthScale và birthRotation không có hậu tố ở đây, đối lập với birthScale0 và birthRotation0 trên emitter hiện đại.

Con trỏ LegacySimple chính là thứ mà các emitter trong danh sách simpleEmitterDefinitionData của system sử dụng. Nếu một system điền vào danh sách đó thay vì complexEmitterDefinitionData, thì đây là khối mà các emitter của nó đọc.

Những thuộc tính emitter đã mất

Bốn thuộc tính của emitter đã bị loại bỏ và giờ chỉ còn xuất hiện trong các bin cũ hoặc tài liệu cũ.

Thuộc tínhLoại bỏ ởThay bằng
shape14.1SpawnShape
Material14.1CustomMaterial và materialOverrideDefinitions
materialDrivers14.1Map materialDrivers trên VfxMaterialDefinitionData
flexOffset15.11Không có thứ thay thế trực tiếp

assetCategory đã bị loại khỏi VfxSystemDefinitionData ở bản vá 14.15.


Những chỗ dễ hiểu sai

Một danh sách ngắn các cách hiểu sai tốn thời gian nhất.

Giả địnhSự thật là
birthScale0 và birthScale1 là một cặp nhỏ nhất và lớn nhấtKhông có birthScale1. Số 0 là tàn dư đặt tên, và tính ngẫu nhiên đến từ probabilityTables
probabilityTables chọn một giá trị từ một tậpNó nhân constantValue với một lần bốc ngẫu nhiên, một lần cho mỗi hạt
birthOrbitalVelocity thêm chuyển động quỹ đạoNó chỉ liên quan tới phép biến đổi và không đóng góp vận tốc nào
miscRenderFlags lật mặtBit 0 tắt kiểm tra độ sâu theo chiều ngược, nên 1 nghĩa là tắt kiểm tra
Ý nghĩa của blendMode phụ thuộc vào primitiveTrạng thái hòa trộn giống nhau cho mọi primitive. Chỉ chế độ 3 ghi độ sâu
textureMult là một tên fileNó là con trỏ tới cả một class định nghĩa. Tên file là một trường bên trong nó
mEyeCandy là thiết lập của emitterNó nằm trên system
Có một scrollRate đơn thuầnChỉ có các biến thể được giới hạn phạm vi, cộng thêm một uvScrollRate chỉ có ở legacy
Có một trường bật tắt soft particleCon trỏ softParticleParams rỗng chính là công tắc
particleLifetime bằng -1 nghĩa là hạt vô hạnNó nghĩa là "sống cho tới khi emitter dừng". Chỉ tồn tại lâu dài khi đi kèm isSingleParticle
Thiếu particleLinger thì bằng khôngMặc định của nó là particleLifetime + 10
Hạt con chết khi cửa sổ của emitter cha đóng lạiHạt con là một system độc lập. Nó kết thúc khi các emitter của chính nó cạn hoặc khi hạt mang nó bị xóa

Tên và kiểu trên trang này được đọc từ bố cục class do engine đăng ký cho bản vá 16.16. Nếu thiếu một thuộc tính hoặc một mô tả bị sai, rất đáng để sửa: xem Cách đóng góp.