×
Menu

NiAccumulator - notes

 
 
Данные новые, от 05 2020!
Т.е. тема сортировки альфы, аккумуляторов и NiSortAdjustNode была изучена, всего навсего, спустя лет 20 после выхода МВ. ^-^
Данные, были получены благодаря изысканиям уважаемого Greatness7.
Раньше, считалось, что это невозможно.
И все аккумуляторы используются только на уровне движка и применение их в локальных ниф файлах, не возможно.
 
Примечание.
NiClusterAccumulator и NiAlphaAccumulator не содержат никаких настроек, или дополнительных полей!
Т.е. в ниф файле, это "пустой" объект не предполагающий каких-то самостоятельных настроек.
В Gamebryo 1.1 были добавлены дополнительные поля, но в Netimmerse 4.0 ничего такого нет.
Проводились различные тесты, с ниф файлами, которые показали невозможность добавление каких либо значений.
Было ошибочное предположение, что таковые там могут быть, поскольку они указаны в справке к Gamebryo 1.1, и некоторые тесты вроде бы намекали на это.
Т.е. если в ниф файле было минимум объектов и после шейпов в SortAjustNode ничего не было, т.е. SortAjustNode и 2 шейпа были единственными объектами в файле. То, в этом случае, добавление двух полей в настройки аккумуляторов не приводило к вылетам и даже показывало какой-то эффект.
Который, впрочем, не давал ничего полезного.
Но дальнейшие тесты, показали, что при добавлении других шейпов, или нод, после SortAjustNode - всегда следовал вылет редактора.
Т.е. опытным путем было доказано отсутствие каких либо полей в настройках аккумуляторов.
И случайное срабатывание было связано с особенностью организации самого ниф файла.
 
Примечание.
Greatness7 писал:
NiAlphaAccumulator only sorts things with alpha blend property
NiClusterAccumulator is for sorting all children
and neither would do anything without NiSortAdjustNode as far as I know. Only when used with the root renderer
pretty sure it has no extra fields
ya i checked. it has none
 
Примечание.
NiAlphaAccumulator вероятно, может быть добавлен в сцену (игровую) где будет выполнять задачи глобально.
Вероятно, это можно сделать посредством МВСЕ 2х.
It is often a good idea to set an alpha accumulator to your renderer. This way, if your scene happens to have alpha textured objects, they will get drawn correctly. Adding an alpha accumulator to a renderer is easy and can be done with the following two lines.
 
Примечание.
Нифскоп, всех версий, не содержит правильных данных в Nif.xml файле!
Т.е. для корректной работы Аккумуляторов требуется правка
Nif.xml файла.
Отдельно коды только для аккумуляторов см. здесь.
 
Примечание.
Аккумуляторы нельзя прописать к раздел экстра даты нод, свойств, или шейпов.
Если такое сделать, дабы "подсмотреть" нет ли там чего интересного ^-^, а затем вызвать SSG и раскрыть атрибуты объекта - последует КТД.
Т.е. редактор, или игра, или СкенеВиювер - сразу же улетят в ошибку.
Не так что бы это было особо важно, но были подобные наблюдения.
 

Выдержка из оригинальной справки. NDL Gamebryo 1.1
 
This class is the abstract base class for all accumulators.  Accumulators implement leaf object-level sorting by storing drawable encapsulations of leaf-level, scene graph geometry objects. During a sorted Click pass of the scene graph, the renderer's accumulator "registers" each rendered leaf geometry object as it is encountered in the pass.
 The accumulator decides at registration time whether it wants to save (register) the object for later rendering or if it wants to render the object immediately.  At the end of the Click pass on the scene graph, the accumulator sorts it's registered objects by some (class dependent) metric and renders them in their sorted order.  Each subclass of NiAccumulator implements different metrics for registering and sorting the objects that are registered with it. 
 
Выдержка из оригинальной справки. NDL Gamebryo 1.1
 
An accumulator that is designed to allow Z-buffered applications to place alpha blended objects wherever they desire in a scene graph, while still being able to render them correctly. Alpha blended objects must be drawn in sorted order with respect to each other by an application. If alpha blended objects are not drawn last and in sorted order, visual artifacts may result. This accumulator avoids the needless overhead of sorting the opaque objects, while sorting the alpha blended ones back-to-front.
The accumulator accomplishes this task by registering only alpha blended objects (leaving the ones with alpha blending turned off to be rendered immediately) and sorting them by using a simple z-sort, based on the center of each object's bounding sphere. In this way, all opaque objects are drawn first in the order that they are traversed in the scene graph. Then, the alpha blended objects are drawn in a sorted order. Please see the notes section below for limitations of the sorting method.
 
Notes
The AlphaAccumulator assumes that either Z-buffering has been turned on for a scene, or that the opaque objects in the scene are presorted such that scene graph traversal ordering is sufficient to sort the objects. In most cases, this approach means that Z-buffering will be turned on for the scene graph.
 
Limitations of the Sorter
The alpha sorted objects are sorted using a simple depth-sort, based on comparing the camera-space bounding-sphere centers of objects. While this method is quite fast and generally works well, there are cases in many scenes where the bounding sphere center does not accurately represent the object. This situation is generally noticeable with pairs of objects that are large and in close proximity to one another.
 
"No Sort" Flag
When the control flag for observing "no sort" hints is set to true (default), the NiAlphaAccumulator does not sort objects that have the NiAlphaProperty "no sort" flag enabled. This flag is set with the NiAlphaProperty NoSorter method.
NiAlphaAccumulator and SubSorters
Applications using NiAlphaAccumulators in conjunction with NiSortAdjustNodes and sub-sorters may run into visual anomalies. If a sub-sorter interrupts a NiAlphaAccumulator, the sub sorter may register and draw alpha blended objects too early (prior to the close of the scene). In order for NiAlphaAccumulators to work, they must generally be the only accumulator in the scene graph, and must cover the entire scene graph. The reason for this arrangement is that a NiAlphaAccumulator draws all of the alpha blended objects that it registers when FinishAccumulating is called on it. If this step happens in a NiSortAdjustNodes deep in a scene graph, the alpha blended objects may be drawn before some opaque objects, which can lead to incorrect blending.