In Unity
teadrinker.github.io/gpu-coding-in-unity
download gpu-coding-in-unity unity project
download camera-bound-test bound unity project
Martin Eklund
meshFilter.mesh = CreateQuadMesh( 4.5f, // car should be around 4 meters 0.1914063f, 0.08691406f, // the size of each sprite Random.Range(0,5), Random.Range(0,10) // randomize car sprite ); // randomize depth value currentPosZ = Random.value * depth; // initialize the speed for this car currentSpeed = speed * (1.0f - speedVariation * Random.value); // initialize position for this car currentPosX = (Random.value - 0.5f) * width;
currentPosX += currentSpeed * Time.deltaTime; if(currentPosX > width/2) { currentPosX = -width/2; } transform.localPosition = new Vector3(currentPosX, 0.0f, currentPosZ);
Properties { _MyVariable ("My Variable", Range(1,10)) = 4 } float _MyVariable; // accessible from the material gui v2f vert (appdata v) { // do this per vertex } fixed4 frag (v2f i) { // do this per pixel }
- Use vertex shader, just redo the same work for each vertex
- Use z-value
- Use hash funtion + a unique value per object
- Rewrite the code so it doesn't need state
// init currentPosX = (Random.value - 0.5f) * width; // update currentPosX += speed * Time.deltaTime;
// no init needed // update float initialPosX = (floatHash(uniqeValueForThisCar) - 0.5f) * width; float posX = initialPosX + speed * timeInSeconds;
// no init needed // update float initialPosX = (floatHash(uniqeValueForThisCar) - 0.5f) * width; float posX = initialPosX + speed * timeInSeconds; posX = (posX + width/2.0f) % width - width/2.0f; // wrap around
v2f vert (appdata v) // unity vertex shader { v2f o; float4 pos = v.vertex; float uniqeValueForThisCar = pos.z; float timeInSeconds = _Time[1]; pos.z *= _depth; // don't randomize depth, this will ensure they are drawn back to front float speed = _speed * (1.0 - _speedVariation * floatHash(uniqeValueForThisCar+1.0)); float initialPosX = (floatHash(uniqeValueForThisCar) - 0.5f) * _width; float posX = initialPosX + speed * timeInSeconds; posX = (posX + _width/2.0f) % _width - _width/2.0f; // wrap around pos.x += posX; // offset quadvertex by car position o.vertex = mul(UNITY_MATRIX_MVP, pos); return o; }
The GPU shader in the unity project also does:
Calculation of uv coordinates
And it is still around 10 times faster than the C# version!
Setting up a new unity project for Gear VR
Anti-aliasing
Try increasing Anti Aliasing in Project Settings/Quality.