A call option on a forward is in essence identical to any other call option - buying a call gives you to right to buy some underlying (can be a stock, a future, a forward, a commodity, an interest rate swap, ... ). I think you are confusing value (zero at initiation of a forward) with price (the cash price of the asset as specified in the forward contract). Instead of spot prices, you use the forward price - that is really the difference.
The delivery date of the forward is the date when the underlying of the forward is transferred. In an option on a forward, you buy the right to buy the forward at some time T. What matters for exercising the option is what the forward price is relative to your strike -> max(F-K,0). It is the same for stock options by the way. You may receive the stock (if it is not cash settled) but it is completely independent of what the stock may be worth at some time in the future (after you exercise). In the worst case, you exercise the option on Friday because S > K but on Monday the firm goes bankrupt and your stock is now worthless. If you do not want to be exposed to changes in the price of the underlying after you exercise, you just sell the stock (or the forward - which in OTC often means you buy an offsetting position).
You can have a look at this answer to see how a spot and forward option look like in FX. This assumes that the forward expires at the exercise time.
With regards to discounting from T̃ or T
If you have a forward that expires later, you get the discounting from the expiry date (delivery date) of the forward. Everything else is identical. You can see this nicely at Matlab's website (where you can even run the code without having a license). An intuitive explanation is given on Wikipedia. It can be replicated quickly in any programming language. Below, I will use Julia.
We first need to import relevant packages, define the CDF and Black pricer. Note that T and T̃ are needed for pricing with Black on forwards where T̃ > T.
using Distributions, DataFrames, Dates
N(x) = cdf(Normal(0,1),x)
# generic Black-76 allowing for futures and forwards
function Black(F,K,T,T̃,rd,σ)
d1 = ( log(F/K) + 0.5*σ^2*T ) / (σ*sqrt(T))
d2 = d1 - σ*sqrt(T)
c = exp(-rd*T̃)*(F*N(d1) - K*N(d2))
p = exp(-rd*T̃)*(K*N(-d2)-F*N(-d1))
return c, p
end
For the rates, we need to be consistent with the Matlab implementation, which uses 30/360 (SIA) in the examples on the webpage. Details for the so called Basis in the intenvset interest rate structure can be found here. EndTimes is the year fraction.
# rates
ValuationDate = Date(2014,1,1);
EndDates = Date(2015,1,1);
Rates = 0.03
# Matlab Basis set to 1 is 30/360 (SIA) https://uk.mathworks.com/help/fininst/intenvset.html#namevaluepairarguments
months = Dates.month(EndDates) - Dates.month(ValuationDate) # compute month difference
years = Dates.year(EndDates) - Dates.year(ValuationDate)
days = (years*12+months)*30
T̃ = days/360
println("Days = $days")
println("Disc $(exp(-Rates*T̃))" )
println("EndTimes = $(T̃)")
$Matlab \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\; Julia$

Now, all that is left is to define the option parameters to match Matlab exactly.
# option
Strike = (200,90) # call / put
AssetPrice = 107
Sigma = 0.28
Settle = Date(2014,1,1)
Maturity = Date(2014,10,1)
months = Dates.month(Maturity) - Dates.month(Settle) # compute month difference
years = Dates.year(Maturity) - Dates.year(Settle)
days = (years*12+months)*30
T = days/360
DataFrame(Call = Black.(AssetPrice,Strike,T,T̃,Rates,Sigma)[1][1],
Put = Black.(AssetPrice,Strike,T,T̃,Rates,Sigma)[2][2])
$Matlab \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\; Julia$

A bit more interesting is to check what happens when the expiry of the forward is set to a date far out. Within Matlab, if ForwardMaturity is not passed, the function calculates prices of future options. If ForwardMaturity is passed, the function computes prices of forward options. For the same option, setting ForwardMaturity to 'Jan-1-2032' (you can try this out yourself on Matlab's website) will give the following results (note, that the second result is an option on a future (or where the forward expires at option expiry).
$Matlab \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\; Julia$
