光照-05.投光物(Light casters)

我們目前使用的所有光照都來自于一個單獨的光源沿猜,這是空間中的一個點枚荣。它的效果不錯,但是在真實世界啼肩,我們有多種類型的光橄妆,它們每個表現(xiàn)都不同。一個光源把光投射到物體上祈坠,叫做投光害碾。這個教程里我們討論幾種不同的投光類型。學(xué)習(xí)模擬不同的光源是你未來豐富你的場景的另一個工具赦拘。

我們首先討論定向光(directional light)慌随,接著是作為之前學(xué)到知識的擴(kuò)展的點光(point light),最后我們討論聚光燈(Spotlight)躺同。下面的教程我們會把這幾種不同的光類型整合到一個場景中阁猜。

定向光(Directional Light)

當(dāng)一個光源很遠(yuǎn)的時候,來自光源的每條光線接近于平行蹋艺。這看起來就像所有的光線來自于同一個方向剃袍,無論物體和觀察者在哪兒。當(dāng)一個光源被設(shè)置為無限遠(yuǎn)時捎谨,它被稱為定向光(也被成為平行光)民效,因為所有的光線都有著同一個方向隘击;它會獨立于光源的位置。

我們知道的定向光源的一個好例子是研铆,太陽埋同。太陽和我們不是無限遠(yuǎn),但它也足夠遠(yuǎn)了棵红,在計算光照的時候凶赁,我們感覺它就像無限遠(yuǎn)。在下面的圖片里逆甜,來自于太陽的所有的光線都被定義為平行光:

因為所有的光線都是平行的虱肄,對于場景中的每個物體光的方向都保持一致,物體和光源的位置保持怎樣的關(guān)系都無所謂交煞。由于光的方向向量保持一致咏窿,光照計算會和場景中的其他物體相似。

我們可以通過定義一個光的方向向量素征,來模擬這樣一個定向光集嵌,而不是使用光的位置向量。著色器計算保持大致相同的要求御毅,這次我們直接使用光的方向向量來代替用position向量計算lightDir向量:

struct Light
{
    // vec3 position; // 現(xiàn)在不在需要光源位置了根欧,因為它是無限遠(yuǎn)的
    vec3 direction;
    vec3 ambient;
    vec3 diffuse;
    vec3 specular;
};
...
void main()
{
    vec3 lightDir = normalize(-light.direction);
    ...
}

注意,我們首先對light.direction向量取反端蛆。目前我們使用的光照計算需要光的方向作為一個來自片段朝向的光源的方向凤粗,但是人們通常更習(xí)慣定義一個定向光作為一個全局方向,它從光源發(fā)出今豆。所以我們必須對全局光的方向向量取反來改變它的方向嫌拣;它現(xiàn)在是一個方向向量指向光源。同時呆躲,確保對向量進(jìn)行標(biāo)準(zhǔn)化處理异逐,因為假定輸入的向量就是一個單位向量是不明智的。

作為結(jié)果的lightDir向量被使用在diffuse和specular計算之前歼秽。

例子里我們先定義10個不同的箱子位置应役,為每個箱子生成不同的模型矩陣情组,每個模型矩陣包含相應(yīng)的本地到世界變換:

// Draw the container (using container's vertex attributes)
glBindVertexArray (containerVAO);
for (GLuint i = 0; i < 10; i++)
{
    model = glm::mat4 ();
    model = glm::translate (model, cubePositions[i]);
    GLfloat angle = 20.0f * i;
    model = glm::rotate (model, angle, glm::vec3 (1.0f, 0.3f, 0.5f));
    glUniformMatrix4fv (modelLoc, 1, GL_FALSE, glm::value_ptr (model));
    glDrawArrays (GL_TRIANGLES, 0, 36);
}
glBindVertexArray (0);

同時燥筷,不要忘記定義光源的方向(注意,我們把方向定義為:從光源處發(fā)出的方向院崇;在下面肆氓,你可以快速看到光的方向的指向):

GLint lightDirPos = glGetUniformLocation (lightingShader.Program, "light.direction");
glUniform3f (lightDirPos, -.02f, -1.0f, -0.3f);

我們已經(jīng)把光的位置和方向向量傳遞為vec3,但是有些人去想更喜歡把所有的向量設(shè)置為vec4.當(dāng)定義位置向量為vec4的時候底瓣,把w元素設(shè)置為1.0非常重要谢揪,這樣平移和投影才會合理的被應(yīng)用蕉陋。然而,當(dāng)定義一個方向向量為vec4時拨扶,我們并不想讓平移發(fā)揮作用(因為它們除了代表方向凳鬓,其他什么也不是)所以我們把w元素設(shè)置為0.0。
方向向量被表示為:vec4(0.2f, 1.0f, 0.3f, 0.0f)患民。這可以作為簡單檢查光的類型的方法:你可以檢查w元素是否等于1.0缩举,查看我們現(xiàn)在所擁有的光的位置向量,w是否等于0.0匹颤,我們有一個光的方向向量仅孩,所以根據(jù)那個調(diào)整計算方法:

if (lightVector.w == 0.0) // Note: be careful for floating point errors
                // Do directional light calculations
else if (lightVector.w == 1.0)
    // Do light calculations using the light's position (like last tutorial)  

有趣的事實:這就是舊OpenGL(固定函數(shù)式)決定一個光源是一個定向光還是位置光源,根據(jù)這個修改它的光照印蓖。

如果你現(xiàn)在編譯應(yīng)用辽慕,飛躍場景,它看起來像有一個太陽一樣的光源赦肃,把光拋到物體身上溅蛉。你可以看到diffuse和specular元素都對該光源進(jìn)行反射了,就像天空上有一個光源嗎他宛?看起來就像這樣:

你可以在這里獲得應(yīng)用的所有代碼温艇。

定點光(Point Light)

定向光作為全局光可以照亮整個場景,這非常棒堕汞,但是另一方面除了定向光勺爱,我們通常也需要幾個定點光,在場景里發(fā)亮讯检。點光是一個在世界里有位置的光源琐鲁,它向所有方向發(fā)光,光線隨距離增加逐漸變暗人灼。想象燈泡和火炬作為投光物围段,它們可以扮演點光的角色。

之前我們定義的光源所模擬光線的強度不會因為距離變遠(yuǎn)而衰減投放,這使得看起來像是光源亮度極強奈泪。在大多數(shù)3D仿真場景中,我們更希望去模擬一個僅僅能照亮靠近光源點附近場景的光源灸芳,而不是照亮整個場景的光源涝桅。

我們想讓黑暗中與光源比較近的箱子被輕微地照亮。

衰減(Attenuation)

隨著光線穿越距離的變遠(yuǎn)使得亮度也相應(yīng)地減少的現(xiàn)象烙样,通常稱之為衰減(Attenuation)冯遂。一種隨著距離減少亮度的方式是使用線性等式。這樣的一個隨著距離減少亮度的線性方程谒获,可以使遠(yuǎn)處的物體更暗蛤肌。然而壁却,這樣的線性方程效果會有點假。在真實世界裸准,通常光在近處時非常亮展东,但是一個光源的亮度,開始的時候減少的非吵淳悖快琅锻,之后隨著距離的增加,減少的速度會慢下來向胡。我們需要一種不同的方程來減少光的亮度恼蓬。

在這里I是當(dāng)前片段的光的亮度,d代表片段到光源的距離僵芹。為了計算衰減值处硬,我們定義3個項:常數(shù)項Kc,一次項Kl和二次項Kq拇派。

  • The constant term is usually kept at 1.0 which is mainly there to make sure the resulting denominator never gets smaller than 1 since it would otherwise boost the intensity with certain distances, which is not the effect we're looking for.
  • The linear term is multiplied with the distance value that reduces the intensity in a linear fashion.
  • The quadratic(二次) term is multiplied with the quadrant of the distance and sets a quadratic decrease of intensity for the light source. The quadratic term will be less significant compared to the linear term when the distance is small, but gets much larger than the linear term as the distance grows.

你可以看到當(dāng)距離很近的時候光有最強的亮度荷辕,但是隨著距離增大,亮度明顯減弱件豌,大約接近100的時候疮方,就會慢慢接近0。這就是我們想要的茧彤。

選擇正確的值

但是骡显,我們把這三個項設(shè)置為什么值呢?正確的值的設(shè)置由很多因素決定:環(huán)境曾掂、你希望光所覆蓋的距離范圍惫谤、光的類型等。大多數(shù)場合珠洗,這是經(jīng)驗的問題溜歪,也要適度調(diào)整。下面的表格展示一些各項的值许蓖,它們模擬現(xiàn)實(某種類型的)光源蝴猪,覆蓋特定的半徑(距離)。第一欄定義一個光的距離膊爪,它覆蓋所給定的項自阱。這些值是大多數(shù)光的良好開始,它是來自Ogre3D's wiki

就像你所看到的蚁飒,常數(shù)項Kc一直都是1.0动壤。一次項Kl為了覆蓋更遠(yuǎn)的距離通常很小萝喘,二次項Kq就更小了淮逻。嘗試用這些值進(jìn)行實驗琼懊,看看它們在你的實現(xiàn)中各自的效果。我們的環(huán)境中爬早,32到100的距離對大多數(shù)光通常就足夠了哼丈。

實現(xiàn)衰減

為了實現(xiàn)衰減,在著色器中我們會需要三個額外數(shù)值:也就是公式的常量筛严、一次項和二次項醉旦。最好把它們儲存在之前定義的Light結(jié)構(gòu)體中。要注意的是我們計算lightDir桨啃,就是在前面的教程中我們所做的车胡,不是像之前的定向光的那部分。

struct Light            // 創(chuàng)建一些光的屬性來各自獨立的影響每個光照
{
    vec3 position;      
    vec3 ambient;
    vec3 diffuse;
    vec3 specular;
    // 公式的常量照瘾、一次項和二次項
    float constant;
    float linear;
    float quadratic;
};

然后匈棘,我們在OpenGL中設(shè)置這些項:我們希望光覆蓋50的距離,所以我們會使用上面的表格中合適的常數(shù)項析命、一次項和二次項:

glUniform1f (glGetUniformLocation (lightingShader.Program, "light.constant"), 1.0f);
glUniform1f (glGetUniformLocation (lightingShader.Program, "light.linear"), 0.09f);
glUniform1f (glGetUniformLocation (lightingShader.Program, "light.quadratic"), 0.032f);

在片段著色器中實現(xiàn)衰減很直接:我們根據(jù)公式簡單的計算衰減值主卫,在乘以ambient、diffuse和specular元素鹃愤。

我們可以通過獲取片段和光源之間的不同向量把向量的長度結(jié)果作為距離項簇搅。我們可以使用GLSL的內(nèi)建length函數(shù)做這件事:

float distance = length(light.position - FragPos);
float attenuation = 1.0f / (light.constant + light.linear * distance + light.quadratic * (distance * distance));

然后,我們在光照計算中软吐,通過把衰減值乘以ambient
瘩将、diffuse和specular顏色,包含這個衰減值凹耙。

我們可以可以把ambient元素留著不變鸟蟹,這樣amient光照就不會隨著距離減少,但是如果我們使用多余1個的光源使兔,所有的ambient
元素會開始疊加建钥,因此這種情況,我們希望ambient光照也衰減虐沥。簡單的調(diào)試出對于你的環(huán)境來說最好的效果熊经。

ambient *= attenuation;
diffuse *= attenuation;
specular *= attenuation;

你可以看到現(xiàn)在只有最近處的箱子的前面被照得最亮。后面的箱子一點都沒被照亮欲险,因為它們距離光源太遠(yuǎn)了镐依。你可以在這里找到項目源碼

聚光燈(Spotlight)

聚光燈是一種位于環(huán)境中某處的光源天试,它不是向所有方向照射槐壳,而是只朝某個方向照射。聚光燈的好例子是路燈或手電筒喜每。

OpenGL中的聚光燈用世界空間位置务唐,一個方向和一個指定聚光燈半徑的切光角來表示雳攘。我們計算的每個片段,如果片段在聚光燈的切光方向之間(就是在圓錐體內(nèi))枫笛,我們就會把片段照亮吨灭。下面的圖可以讓你明白聚光燈是如何工作的:

  • LightDir:從片段指向光源的向量。
  • SpotDir:聚光燈所指向的方向刑巧。
  • Phiφ:定義聚光燈半徑的切光角喧兄。每個落在這個角度之外的,聚光燈都不會照亮啊楚。
  • Thetaθ:LightDir向量和SpotDir向量之間的角度吠冤。θ值應(yīng)該比φ值小,這樣才會在聚光燈內(nèi)恭理。

所以我們大致要做的是咨演,計算LightDir向量和SpotDir向量的點乘(返回兩個單位向量的點乘,還記得嗎蚯斯?)薄风,然后在和遮光角φ對比。我們下面將創(chuàng)建手電筒的范例拍嵌。

手電筒

手電筒是一個坐落在觀察者位置的聚光燈遭赂,通常瞄準(zhǔn)玩家透視圖的前面『崃荆基本上說撇他,一個手電筒是一個普通的聚光燈,但是根據(jù)玩家的位置和方向持續(xù)的更新它的位置和方向狈蚤。

所以我們需要為片段著色器提供的值困肩,是聚光燈的位置向量(來計算光的方向坐標(biāo)),聚光燈的方向向量和遮光角脆侮。我們可以把這些值儲存在Light結(jié)構(gòu)體中:

struct Light
{
    vec3 position;
    vec3 direction;
    float cutOff;
    ...
};

下面我們把這些適當(dāng)?shù)闹祩鹘o著色器:

glUniform3f (lightPosLoc, camera.Position.x, camera.Position.y, camera.Position.z);
glUniform3f (lightSpotdirLoc, camera.Front.x, camera.Front.y, camera.Front.z);
glUniform1f (lightSpotCutOffLoc, glm::cos (glm::radians (12.5f)));

你可以看到锌畸,我們?yōu)檎诠饨窃O(shè)置一個角度,但是我們根據(jù)一個角度計算了余弦值靖避,把這個余弦結(jié)果傳給了片段著色器潭枣。這么做的原因是在片段著色器中,我們計算LightDir和SpotDir向量的點乘幻捏,而點乘返回一個余弦值盆犁,不是一個角度,所以我們不能直接把一個角度和余弦值對比篡九。為了獲得這個角度谐岁,我們必須計算點乘結(jié)果的反余弦,這個操作開銷是很大的。所以為了節(jié)約一些性能伊佃,我們先計算給定切光角的余弦值窜司,然后把結(jié)果傳遞給片段著色器。由于每個角度都被表示為余弦了锭魔,我們可以直接對比它們例证,而不用進(jìn)行任何開銷高昂的操作路呜。

現(xiàn)在剩下要做的是計算θ值迷捧,用它和φ值對比,以決定我們是否在或不在聚光燈的內(nèi)部:

float theta = dot(lightDir, normalize(-light.direction));
if(theta > light.cutOff)
{
    // 執(zhí)行光照計算
}
else // 否則使用環(huán)境光胀葱,使得場景不至于完全黑暗
color = vec4(light.ambient*vec3(texture(material.diffuse,TexCoords)

我們首先計算lightDir和取反的direction向量的點乘漠秋。確保對所有相關(guān)向量進(jìn)行了標(biāo)準(zhǔn)化處理。

你可能奇怪為什么if條件中使用>符號而不是<符號抵屿。為了在聚光燈以內(nèi)庆锦,θ不是應(yīng)該比光的遮光值更小嗎?這沒錯轧葛,但是不要忘了搂抒,角度值是以余弦值來表示的,一個0度的角表示為1.0的余弦值尿扯,當(dāng)一個角是90度的時候被表示為0.0的余弦值求晶,你可以在這里看到:



現(xiàn)在你可以看到,余弦越是接近1.0衷笋,角度就越小芳杏。這就解釋了為什么θ需要比切光值更大了。切光值當(dāng)前被設(shè)置為12.5的余弦辟宗,它等于0.9978爵赵,所以θ的余弦值在0.9979和1.0之間,片段會在聚光燈內(nèi)泊脐,被照亮空幻。

運行應(yīng)用,在聚光燈內(nèi)的片段才會被照亮容客。這看起來像這樣:

你可以在這里獲得項目代碼

它看起來仍然有點假氛悬,原因是聚光燈有了一個硬邊。片段著色器一旦到達(dá)了聚光燈的圓錐邊緣耘柱,它就立刻黑了下來如捅,卻沒有任何平滑減弱的過度。一個真實的聚光燈的光會在它的邊界處平滑減弱的调煎。

平滑/軟化邊緣

為創(chuàng)建聚光燈的平滑邊镜遣,我們希望去模擬的聚光燈有一個內(nèi)圓錐和外圓錐。我們可以把內(nèi)圓錐設(shè)置為前面部分定義的圓錐,我們希望外圓錐從內(nèi)邊到外邊逐步的變暗悲关。

為創(chuàng)建外圓錐谎僻,我們簡單定義另一個余弦值,它代表聚光燈的方向向量和外圓錐的向量(等于它的半徑)的角度寓辱。然后艘绍,如果片段在內(nèi)圓錐和外圓錐之間胚泌,就會給它計算出一個0.0到1.0之間的亮度驶俊。如果片段在內(nèi)圓錐以內(nèi)這個亮度就等于1.0伐脖,如果在外面就是0.0手素。

我們可以使用下面的公式計算這樣的值:

I=(θ?γ) / ?

這里?是內(nèi)部圓錐和外部圓錐余弦值的差章喉。結(jié)果I的值是聚光燈在當(dāng)前片段的亮度娱两。

我們使用一個例子來解釋這個公式的工作原理:

就像你看到的那樣我們基本是根據(jù)θ在外余弦和內(nèi)余弦之間插值奥邮。

由于我們現(xiàn)在有了一個亮度值腥光,當(dāng)在聚光燈外的時候是個負(fù)的崔涂,當(dāng)在內(nèi)部圓錐以內(nèi)大于1阳掐。如果我們適當(dāng)?shù)匕堰@個值固定,我們在片段著色器中就再不需要if-else了冷蚂,我們可以簡單地用計算出的亮度值乘以光的元素:

float theta     = dot(lightDir, normalize(-light.direction));
float epsilon   = light.cutOff - light.outerCutOff;
float intensity = clamp((theta - light.outerCutOff) / epsilon, 0.0, 1.0);    
...
// We'll leave ambient unaffected so we always have a little light.
diffuse  *= intensity;
specular *= intensity;
...

注意缭保,我們使用了clamp函數(shù),它把第一個參數(shù)固定在0.0和1.0之間蝙茶。這保證了亮度值不會超出[0, 1]以外艺骂。

確定你把outerCutOff值添加到了Light結(jié)構(gòu)體,并在應(yīng)用中設(shè)置了它的uniform值尸闸。對于下面的圖片彻亲,內(nèi)部遮光角12.5f,外部遮光角是17.5f:

可以在這里找到項目源碼吮廉。

這樣的一個手電筒/聚光燈類型的燈光非常適合恐怖游戲苞尝,結(jié)合定向和點光,環(huán)境會真的開始被照亮了宦芦。

練習(xí)

  • 試著修改上面的各種不同種類的光源及其片段著色器宙址。試著將部分矢量進(jìn)行反向并嘗試使用 < 來代替 > 。試著解釋這些修改導(dǎo)致不同顯示效果的原因调卑。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抡砂,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子恬涧,更是在濱河造成了極大的恐慌注益,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溯捆,死亡現(xiàn)場離奇詭異丑搔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門啤月,熙熙樓的掌柜王于貴愁眉苦臉地迎上來煮仇,“玉大人,你說我怎么就攤上這事谎仲≌愕妫” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵郑诺,是天一觀的道長夹姥。 經(jīng)常有香客問我,道長间景,這世上最難降的妖魔是什么佃声? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任艺智,我火速辦了婚禮倘要,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘十拣。我一直安慰自己封拧,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布夭问。 她就那樣靜靜地躺著泽西,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缰趋。 梳的紋絲不亂的頭發(fā)上捧杉,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機(jī)與錄音秘血,去河邊找鬼味抖。 笑死,一個胖子當(dāng)著我的面吹牛灰粮,可吹牛的內(nèi)容都是我干的仔涩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼粘舟,長吁一口氣:“原來是場噩夢啊……” “哼熔脂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起柑肴,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤霞揉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后晰骑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體适秩,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了隶症。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片政模。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蚂会,靈堂內(nèi)的尸體忽然破棺而出淋样,到底是詐尸還是另有隱情,我是刑警寧澤胁住,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布趁猴,位于F島的核電站,受9級特大地震影響彪见,放射性物質(zhì)發(fā)生泄漏儡司。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一余指、第九天 我趴在偏房一處隱蔽的房頂上張望捕犬。 院中可真熱鬧,春花似錦酵镜、人聲如沸碉碉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垢粮。三九已至,卻和暖如春靠粪,著一層夾襖步出監(jiān)牢的瞬間蜡吧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工占键, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留昔善,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓捞慌,卻偏偏與公主長得像耀鸦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子啸澡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 一個光源把光投射到物體上袖订,叫做投光(Light casters)。 定向光 當(dāng)一個光源很遠(yuǎn)的時候嗅虏,來自光源的每條光...
    龍遁流閱讀 366評論 0 1
  • 一洛姑、四大光照類型1.環(huán)境光(Ambient Light) 一個物體即使沒有直接被光源照射,但是只要有光線通過其他物...
    CarlDonitz閱讀 1,471評論 0 0
  • 一皮服、如果你想閱讀整個世界楞艾,全世界就會來幫助你 手機(jī)有一種超乎尋常的力量帶你走入放松的狀態(tài)参咙,并且使你走進(jìn)其他人的思維...
    幻想家Melon閱讀 255評論 0 0
  • 今天的三種感受:焦急、開心硫眯、溫馨 今天的小進(jìn)步:今天早早起床帶小寶打完預(yù)防針后蕴侧,去了醫(yī)院檢查身體。因為產(chǎn)后身體一直...
    小嬪_1e27閱讀 149評論 0 0
  • 第四重天:散發(fā)愛能量 (自2015-11-17開啟本階段) 某某人两入,你覺得自己的人生中净宵,過去或現(xiàn)在,曾經(jīng)或正在裹纳,有...
    李英花閱讀 107評論 0 0