Saturday 16 January 2016

Project 3: Grass Sim

Overview

One of the main problems with rendering lots of primitives, is each one requires its own draw call/position definition.
A solution to this is instanced rendering, where you give opengl a set of vertices and tell it to render it X amount of times. Since it computes everything internally from then on the cost of it is near 0.

Instanced rendering does this (pseudo code):
for 0, X do
Set Instance ID
DrawArrays/DrawElements.etc

In the form of this:
GL.DrawArraysInstanced(PrimitiveType.Triangles, 0, 3, X);

So now the fun part involves the shaders because each instance cannot be given a unique uniform value (which is what I do normally).
Each instance has an ID from 0->X, utilising this in interesting ways allows you to produce cool effects for practically free.

Here's what I came up with after playing around with it:


Video after adding a time uniform:

 

Vertex Shader Details

To distribute the triangles uniformly given a number from 0 -> 10,000.
int x = int( mod( gl_InstanceID, 100 ) );
int z = int( gl_InstanceID / 100 );

To offset the period of each triangle's sin value (not worked out how to make fake-random numbers on shaders yet). Give uT as a value from 0, 2PI. Remember uT is defined once for all the "grass".
float sVal = sin( gl_InstanceID + uT );
oDisplace = vec3( sVal, 0, 0 );

Conclusion

My "grass" is nothing like grass yet, I'll be posting more in the next few days with any progress. I think colouring them is my next objective and then figuring out that tricky random displacement problem.

Here's a download link if you want to give it a spin: LINK

No comments:

Post a Comment

The difference between class and object.

 The difference between class and object is subtle and misunderstood frequently. It is important to understand the difference in order to wr...