never done or heard about this ...
If you need simulation then search for biology/botanist sites instead.
If you need just visually close results then I would:
make a polygon covering the cut (circle/oval like shape)
start with circle and when all working try to add some random distortion or use ellipse
create 1D texture with the density
it will be used to fill the polygon via triangle fan. So first find an image of the tree type you want to generate for example this:

Analyze the color and intensity as a function of diameter so extract a pie like piece (or a thin rectangle)

and plot a graph of R,G,B
values to see how the rings are shaped

then create function that approximate that (or use piecewise interpolation) and create your own texture as function of tree age. You can interpolate in this way booth the color and density of rings.
My example shows that for this tree the color is the same so only its intensity changes. In this case you do not need to approximate all 3 functions. The bumps are a bit noisy due to another texture layer (ignore this at start). You can use:
intensity=A*|cos(pi*t)|
as a start
A
is brightness
t
is age in years/cycles (and also the x coordinate (scaled) in your 1D texture)
so take base color R,G,B
multiply it by A
for each t
and fill the texture pixel with this color. You can add some randomness to ring period (pi*t)
and also the scale can be matched more closely. This is linear growth ,... so you can use exponential instead or interpolate to match bumps per length affected by age (distance form t=0
)...
now just render the polygon
mid point is the t=0
coordinate in texture each vertex of polygon is t=full_age
coordinate in texture. So render the triangle fan with these texture coordinates. If you need more close match (rings are not the same thickness along the perimeter) then you can convert this to 2D texture
[Notes]
You can also do this incrementally so do just one ring per iteration. Next ring polygon is last one enlarged or scaled by scale>1
and add some randomness, but this needs to be rendered by QUAD STRIP
. You can have static texture for single ring so interpolate just the density and overall brightness:
radius(i)=radius(i-1)+ring_width=radius(i-1)*scale
so:
scale=(radius(i-1)+ring_width)/radius(i-1)