Today I created the main render queue used in Material System and game engines.
It has an interface called ISurfaceMaterial, which allows you to set shaders, render states, or shader parameter values.
The model is one I used at a company I worked for in the past. I used it for testing. ㅋ
I also created the SceneCamera component.
The camera component basically has two modes: 'Independent Camera Mode' and 'Child Camera Mode'.
Independent Camera Mode has a render queue and also has a buffer clear function.
In Child Camera Mode, when you place a SceneActor using an independent camera as a child node, it becomes dependent on the independent camera.
In this case, it doesn't have its own render queue and doesn't perform buffer clearing either.
If you add a function that allows multiple cameras to fill their rendering data with multithreading, it will be very helpful for multithreaded rendering. I've added the functionality itself.
As you can see below, we are rendering several models... It looks like we are rendering about 3,000 of them. In this case, I modified it so that objects outside the camera are not rendered using frustum culling.
According to the GDC presentation materials from a developer who developed the Battlefield's ProBuilder engine... they completed the culling work for screen rendering with only SIMD frustum culling and occlusion culling without any special BVH culling.
So, although there is no occlusion culling yet, I implemented SIMD frustum culling based on the GDC presentation materials.
Here are the test results.

Ah... it's only about twice as fast... I implemented it using SSE, and I aligned the memory order and batching to SIMD.
It's only twice as fast. Documents say it should be 4~5 times faster... ㅎㅎ It might be because there are not many functions yet.
Or, the design of the class or data structure may need to be more cache-friendly by making it in a continuous way.
I think I need to organize and optimize the source code here once, stabilize the source code, etc.
Thank you.