RTT is already implemented in horde. The camera node has a param called "OutputTex" which is the ID of a texture resource to render to (or default 0 renders to the screen).
NVidia's pseudo instancing is not just a shader-based technique - it requires the way that the matrices are sent to GL by the CPU to be modified in the engine. NVidia use a hack where they store world matrices inside the texture coordinate storage instead of GLSL uniform storage, which is slightly easier for their drivers to deal with.
From the PDF:
Quote:
Pseudo-instancing applies well to geometry with a small number of per-instance attributes.
The technique does not scale well to complex mesh rendering techniques like skinning; there
are not enough vertex attributes to store all of the bone transforms for each instance.
So this technique would not work for a lot of horde models, such as animated characters - but probably would work for your vegitation.
Quote:
Direct3D instancing reduces the number of DrawIndexedPrimitive() calls from many to one.
This DrawIndexedPrimitive() call reduction has a large performance benefit in Direct3D.
In OpenGL, the application still calls glDrawElements() (or the like) for every instance.
This isn’t too much of a performance hit because glDrawElements() is very efficient in OpenGL.
This points out that instancing solves different problems in GL and DX - in DX, each draw call is very slow, so instancing is used to group them together. In GL, draw calls are much faster, so instancing doesn't help as much here.
Furthermore pseudo instancing doesn't actually reduce draw calls at all - you need the real deal (in GL3.1) to achieve that. Pseudo instancing is only used to slightly speed up the calculation of the world-view-projection matrix.
It should be pretty easy to add to the engine - the only modification is the way in which the world matrix is sent to the shader. Shader resources would require a flag of some sort to indicate to the engine which method to use.