Is it possible to dynamically reduce the number particles based on distance from camera?
You can use a script that calculates the distance of each vertex in your grass field from the camera at each frame, and updates a vertex group controlling your particle system's density accordingly.

To get this to work:

Your grass field needs to have a vertex group, with all vertices included (create then select all verts and press &quot;Assign&quot;).
In your particle system, you need to set this vertex group as the Density group, with inverted weight (see the image below).
Make sure to replace the names of your grass field object, particle system and vertex group if needed in the script (they're called &quot;Plane&quot;, &quot;ParticleSystem&quot; and &quot;Group&quot; in the code below).
Open a text editor window, create a new text file, copy the code there and press &quot;Run Script&quot;.


Here's the code:
import bpy

def weight_from_distance( scene ):
    floor = bpy.data.objects['Plane']  # &lt;== REPLACE &quot;Plane&quot; with the name of your grass field object
    cam   = bpy.data.objects['Camera']

    vert_distances = [ 
        ( cam.location - floor.matrix_world @ v.co ).length for v in floor.data.vertices #Updated for 2.8+: Replaced '*' with '@'
    ]

    maxDist = max( vert_distances )
    minDist = min( vert_distances )

    for i, d in enumerate( vert_distances ):
        # Normalize distance and set as vertex weight
        floor.data.vertices[i].groups[0].weight = ( d - minDist ) / ( maxDist - minDist )

    pSysName      = 'ParticleSystem' # &lt;== REPLACE with the name of your grass' particle system if needed
    vertGroupName = 'Group'          # &lt;== REPLACE with the name of your vertex group if needed
        
    floor.particle_systems[ pSysName ].vertex_group_density = vertGroupName # Update / Refresh

bpy.app.handlers.frame_change_pre.append( weight_from_distance )