Metal框架詳細(xì)解析(三十九) —— Metal編程指南之資源對象:緩沖區(qū)和紋理(四)

版本記錄

版本號 時(shí)間
V1.0 2018.11.04 星期日

前言

很多做視頻和圖像的硫眨,相信對這個(gè)框架都不是很陌生憨闰,它渲染高級3D圖形,并使用GPU執(zhí)行數(shù)據(jù)并行計(jì)算嗓奢。接下來的幾篇我們就詳細(xì)的解析這個(gè)框架。感興趣的看下面幾篇文章浑厚。
1. Metal框架詳細(xì)解析(一)—— 基本概覽
2. Metal框架詳細(xì)解析(二) —— 器件和命令(一)
3. Metal框架詳細(xì)解析(三) —— 渲染簡單的2D三角形(一)
4. Metal框架詳細(xì)解析(四) —— 關(guān)于GPU Family 4(一)
5. Metal框架詳細(xì)解析(五) —— 關(guān)于GPU Family 4之關(guān)于Imageblocks(二)
6. Metal框架詳細(xì)解析(六) —— 關(guān)于GPU Family 4之關(guān)于Tile Shading(三)
7. Metal框架詳細(xì)解析(七) —— 關(guān)于GPU Family 4之關(guān)于光柵順序組(四)
8. Metal框架詳細(xì)解析(八) —— 關(guān)于GPU Family 4之關(guān)于增強(qiáng)的MSAA和Imageblock采樣覆蓋控制(五)
9. Metal框架詳細(xì)解析(九) —— 關(guān)于GPU Family 4之關(guān)于線程組共享(六)
10. Metal框架詳細(xì)解析(十) —— 基本組件(一)
11. Metal框架詳細(xì)解析(十一) —— 基本組件之器件選擇 - 圖形渲染的器件選擇(二)
12. Metal框架詳細(xì)解析(十二) —— 基本組件之器件選擇 - 計(jì)算處理的設(shè)備選擇(三)
13. Metal框架詳細(xì)解析(十三) —— 計(jì)算處理(一)
14. Metal框架詳細(xì)解析(十四) —— 計(jì)算處理之你好股耽,計(jì)算(二)
15. Metal框架詳細(xì)解析(十五) —— 計(jì)算處理之關(guān)于線程和線程組(三)
16. Metal框架詳細(xì)解析(十六) —— 計(jì)算處理之計(jì)算線程組和網(wǎng)格大小(四)
17. Metal框架詳細(xì)解析(十七) —— 工具钳幅、分析和調(diào)試(一)
18. Metal框架詳細(xì)解析(十八) —— 工具物蝙、分析和調(diào)試之Metal GPU Capture(二)
19. Metal框架詳細(xì)解析(十九) —— 工具、分析和調(diào)試之GPU活動(dòng)監(jiān)視器(三)
20. Metal框架詳細(xì)解析(二十) —— 工具敢艰、分析和調(diào)試之關(guān)于Metal著色語言文件名擴(kuò)展名诬乞、使用Metal的命令行工具構(gòu)建庫和標(biāo)記Metal對象和命令(四)
21. Metal框架詳細(xì)解析(二十一) —— 基本課程之基本緩沖區(qū)(一)
22. Metal框架詳細(xì)解析(二十二) —— 基本課程之基本紋理(二)
23. Metal框架詳細(xì)解析(二十三) —— 基本課程之CPU和GPU同步(三)
24. Metal框架詳細(xì)解析(二十四) —— 基本課程之參數(shù)緩沖 - 基本參數(shù)緩沖(四)
25. Metal框架詳細(xì)解析(二十五) —— 基本課程之參數(shù)緩沖 - 帶有數(shù)組和資源堆的參數(shù)緩沖區(qū)(五)
26. Metal框架詳細(xì)解析(二十六) —— 基本課程之參數(shù)緩沖 - 具有GPU編碼的參數(shù)緩沖區(qū)(六)
27. Metal框架詳細(xì)解析(二十七) —— 高級技術(shù)之圖層選擇的反射(一)
28. Metal框架詳細(xì)解析(二十八) —— 高級技術(shù)之使用專用函數(shù)的LOD(一)
29. Metal框架詳細(xì)解析(二十九) —— 高級技術(shù)之具有參數(shù)緩沖區(qū)的動(dòng)態(tài)地形(一)
30. Metal框架詳細(xì)解析(三十) —— 延遲照明(一)
31. Metal框架詳細(xì)解析(三十一) —— 在視圖中混合Metal和OpenGL渲染(一)
32. Metal框架詳細(xì)解析(三十二) —— Metal渲染管道教程(一)
33. Metal框架詳細(xì)解析(三十三) —— Metal渲染管道教程(二)
34. Metal框架詳細(xì)解析(三十四) —— Hello Metal! 一個(gè)簡單的三角形的實(shí)現(xiàn)(一)
35. Metal框架詳細(xì)解析(三十五) —— Hello Metal! 一個(gè)簡單的三角形的實(shí)現(xiàn)(二)
36. Metal框架詳細(xì)解析(三十六) —— Metal編程指南之概覽(一)
37. Metal框架詳細(xì)解析(三十七) —— Metal編程指南之基本Metal概念(二)
38. Metal框架詳細(xì)解析(三十八) —— Metal編程指南之命令組織和執(zhí)行模型(三)

Resource Objects: Buffers and Textures - 資源對象:緩沖區(qū)和紋理

本章介紹用于存儲(chǔ)未格式化內(nèi)存和格式化圖像數(shù)據(jù)的Metal資源對象(MTLResource)丽惭。 有兩種類型的MTLResource對象:

  • MTLBuffer表示可以包含任何類型數(shù)據(jù)的未格式化內(nèi)存的分配击奶。 緩沖區(qū)通常用于頂點(diǎn),著色器和計(jì)算狀態(tài)數(shù)據(jù)责掏。
  • MTLTexture表示具有指定紋理類型和像素格式的格式化圖像數(shù)據(jù)的分配柜砾。 紋理對象用作頂點(diǎn),片段或計(jì)算函數(shù)的源紋理换衬,以及存儲(chǔ)圖形渲染輸出(即作為attachment)痰驱。

本章還討論了MTLSamplerState對象。 雖然采樣器本身不是資源瞳浦,但在使用紋理對象執(zhí)行查找計(jì)算時(shí)會(huì)使用它們担映。


Buffers Are Typeless Allocations of Memory - 緩沖區(qū)是內(nèi)存的無類型分配

MTLBuffer對象表示可以包含任何類型數(shù)據(jù)的內(nèi)存分配。

1. Creating a Buffer Object - 創(chuàng)建緩沖區(qū)對象

以下MTLDevice方法創(chuàng)建并返回MTLBuffer對象:

所有緩沖區(qū)創(chuàng)建方法都具有輸入值length短蜕,以指示存儲(chǔ)分配的大小(以字節(jié)為單位)傻咖。所有方法還接受MTLResourceOptions對象朋魔,以獲取可以修改創(chuàng)建的緩沖區(qū)行為的options。如果options的值為0卿操,則默認(rèn)值用于資源選項(xiàng)警检。

2. Buffer Methods - 緩沖方法

MTLBuffer協(xié)議具有以下方法:


Textures Are Formatted Image Data - 紋理是格式化圖像數(shù)據(jù)

MTLTexture對象表示格式化圖像數(shù)據(jù)的分配窥摄,可以將其用作頂點(diǎn)著色器憎瘸,片段著色器或計(jì)算函數(shù)的資源勋磕,或者用作要用作渲染目標(biāo)的attachment杨赤。 MTLTexture對象可以具有以下結(jié)構(gòu)之一:

  • 1D堕扶,2D或3D圖像
  • 一維或一維2D圖像
  • 六個(gè)2D圖像的立方體

MTLPixelFormat指定MTLTexture對象中各個(gè)像素的組織南用。像素格式在Pixel Formats for Textures中進(jìn)一步討論萨赁。

1. Creating a Texture Object - 創(chuàng)建紋理對象

以下方法創(chuàng)建并返回MTLTexture對象:

  • newTextureWithDescriptor:方法使用MTLTextureDescriptor對象創(chuàng)建一個(gè)具有紋理圖像數(shù)據(jù)的新存儲(chǔ)分配的MTLTexture對象來描述紋理的屬性鞭呕。
  • MTLTexturenewTextureViewWithPixelFormat:方法創(chuàng)建一個(gè)MTLTexture對象文捶,該對象與調(diào)用MTLTexture對象共享相同的存儲(chǔ)分配吱瘩。由于它們共享相同的存儲(chǔ)空間道伟,因此對新紋理對象的像素的任何更改都會(huì)反映在調(diào)用紋理對象中,反之亦然。對于新創(chuàng)建的紋理蜜徽,newTextureViewWithPixelFormat:方法重新解釋調(diào)用MTLTexture對象的存儲(chǔ)分配的現(xiàn)有紋理圖像數(shù)據(jù)祝懂,就好像數(shù)據(jù)以指定的像素格式存儲(chǔ)一樣。新紋理對象的MTLPixelFormat必須與原始紋理對象的MTLPixelFormat兼容拘鞋。 (有關(guān)普通砚蓬,壓縮和壓縮像素格式的詳細(xì)信息,請參閱Pixel Formats for Textures盆色。)
  • MTLBuffernewTextureWithDescriptor:offset:bytesPerRow:方法創(chuàng)建一個(gè)MTLTexture對象灰蛙,該對象共享調(diào)用MTLBuffer對象的存儲(chǔ)分配作為其紋理圖像數(shù)據(jù)。由于它們共享相同的存儲(chǔ)隔躲,因此對新紋理對象的像素的任何更改都會(huì)反映在調(diào)用紋理對象中摩梧,反之亦然。在紋理和緩沖區(qū)之間共享存儲(chǔ)可以防止使用某些紋理優(yōu)化宣旱,例如像素調(diào)整或平鋪仅父。

2. Creating a Texture Object with a Texture Descriptor - 使用紋理描述符創(chuàng)建紋理對象

MTLTextureDescriptor定義用于創(chuàng)建MTLTexture對象的屬性,包括其圖像大谢胍鳌(寬度笙纤,高度和深度),像素格式买置,排列(數(shù)組或多維數(shù)據(jù)集類型)和mipmap數(shù)粪糙。 MTLTextureDescriptor屬性僅在創(chuàng)建MTLTexture對象期間使用。創(chuàng)建MTLTexture對象后忿项,其MTLTextureDescriptor對象中的屬性更改不再對該紋理產(chǎn)生任何影響蓉冈。

要從描述符創(chuàng)建一個(gè)或多個(gè)紋理:

Listing 3-1顯示了用于創(chuàng)建紋理描述符txDesc并為3D64x64x64紋理設(shè)置其屬性的代碼分歇。

// Listing 3-1  Creating a Texture Object with a Custom Texture Descriptor

MTLTextureDescriptor* txDesc = [[MTLTextureDescriptor alloc] init];
txDesc.textureType = MTLTextureType3D;
txDesc.height = 64;
txDesc.width = 64;
txDesc.depth = 64;
txDesc.pixelFormat = MTLPixelFormatBGRA8Unorm;
txDesc.arrayLength = 1;
txDesc.mipmapLevelCount = 1;
id <MTLTexture> aTexture = [device newTextureWithDescriptor:txDesc];

3. Working with Texture Slices - 使用紋理切片

切片(slice)是單個(gè)1D傀蓉,2D或3D紋理圖像及其所有關(guān)聯(lián)的mipmap。對于每個(gè)切片:

  • 基準(zhǔn)級別mipmap的大小由MTLTextureDescriptor對象的width职抡,heightdepth屬性指定葬燎。
  • mipmap級別i的縮放尺寸由max(1,floor(width / 2i))x max(1繁调,floor(height / 2i))x max(1萨蚕,floor(depth / 2i))指定。最大mipmap級別是第一個(gè)mipmap級別蹄胰,其中實(shí)現(xiàn)了1 x 1 x 1的大小岳遥。
  • 一個(gè)切片中的mipmap級別的數(shù)量可以由floor(log2(max(width,height裕寨,depth)))+ 1確定浩蓉。

所有紋理對象至少有一個(gè)切片;立方體和數(shù)組紋理類型可能有多個(gè)切片宾袜。在寫入和讀取在紋理中復(fù)制圖像數(shù)據(jù)和Copying Image Data to and from a Texture中討論的紋理圖像數(shù)據(jù)的方法中捻艳,slice是從零開始的輸入值。對于1D庆猫,2D或3D紋理认轨,只有一個(gè)切片,因此切片的值必須為0月培。立方體紋理具有6個(gè)總2D切片嘁字,從0到5尋址。對于1DArray2DArray紋理類型杉畜,每個(gè)數(shù)組element代表一個(gè)切片纪蜒。例如,對于arrayLength = 102DArray紋理類型此叠,總共有10個(gè)切片纯续,從0到9尋址。要從整體紋理結(jié)構(gòu)中選擇單個(gè)1D灭袁,2D或3D圖像猬错,首先選擇切片,然后選擇該切片中的mipmap級別茸歧。

4. Creating a Texture Descriptor with Convenience Methods - 使用便捷方法創(chuàng)建紋理描述符

對于常見的2D和立方體紋理兔魂,請使用以下便捷方法創(chuàng)建MTLTextureDescriptor對象,并自動(dòng)設(shè)置其若干屬性值:

兩種MTLTextureDescriptor便捷方法都接受輸入值pixelFormat,它定義紋理的像素格式纹烹。兩種方法也接受mipmapped的輸入值页滚,該值確定紋理圖像是否是mipmapped。 (如果mipmapped為YES铺呵,則紋理被mipmap處理裹驰。)

Listing 3-2使用texture2DDescriptorWithPixelFormat:width:height:mipmapped:方法為未mipmapped64x64 2D紋理創(chuàng)建描述符對象。

Listing 3-2  Creating a Texture Object with a Convenience Texture Descriptor

MTLTextureDescriptor *texDesc = [MTLTextureDescriptor 
         texture2DDescriptorWithPixelFormat:MTLPixelFormatBGRA8Unorm 
         width:64 height:64 mipmapped:NO];
id <MTLTexture> myTexture = [device newTextureWithDescriptor:texDesc];

5. Copying Image Data to and from a Texture - 將圖像數(shù)據(jù)復(fù)制到紋理和從紋理復(fù)制

要將圖像數(shù)據(jù)同步復(fù)制到MTLTexture對象的存儲(chǔ)分配中或從中復(fù)制數(shù)據(jù)片挂,請使用以下方法:

Listing 3-3顯示了如何調(diào)用replaceRegion:mipmapLevel:slice:withBytes:bytesPerRow:bytesPerImage:從系統(tǒng)內(nèi)存中的源數(shù)據(jù)指定紋理圖像讥脐,textureData遭居,在切片0mipmap級別0。

// Listing 3-3  Copying Image Data into the Texture

//  pixelSize is the size of one pixel, in bytes
//  width, height - number of pixels in each dimension
NSUInteger myRowBytes = width * pixelSize;
NSUInteger myImageBytes = rowBytes * height;
[tex replaceRegion:MTLRegionMake2D(0,0,width,height)
    mipmapLevel:0 slice:0 withBytes:textureData
    bytesPerRow:myRowBytes bytesPerImage:myImageBytes];

6. Pixel Formats for Textures - 紋理的像素格式

MTLPixelFormat指定MTLTexture對象的各個(gè)像素中的顏色攘烛,深度和模板數(shù)據(jù)存儲(chǔ)的組織魏滚。有三種像素格式:ordinary, packed, and compressed

  • Ordinary格式只有常規(guī)的8位坟漱,16位或32位顏色分量鼠次。每個(gè)組件都安排在增加的內(nèi)存地址中,第一個(gè)列出的組件位于最低地址芋齿。例如腥寇,MTLPixelFormatRGBA8Unorm是32位格式,每個(gè)顏色分量有8位觅捆;最低地址包含紅色赦役,下一個(gè)地址包含綠色,依此類推栅炒。相反掂摔,對于MTLPixelFormatBGRA8Unorm术羔,最低地址包含藍(lán)色,下一個(gè)地址包含綠色乙漓,依此類推级历。
  • Packed格式將多個(gè)組件組合成一個(gè)16位或32位值,其中組件從最低位到最高位(LSB到MSB)存儲(chǔ)叭披。例如寥殖,MTLPixelFormatRGB10A2Uint是一種32位打包格式,由三個(gè)10位通道(R涩蜘,G和B)和兩位alpha組成嚼贡。
  • Compressed格式以像素塊排列,每個(gè)塊的布局特定于該像素格式同诫。壓縮像素格式只能用于2D粤策,2D陣列或立方體紋理類型。壓縮格式不能用于創(chuàng)建1D剩辟,2DMultisample3D紋理掐场。

MTLPixelFormatGBGR422MTLPixelFormatBGRG422是特殊的像素格式,用于存儲(chǔ)YUV顏色空間中的像素贩猎。這些格式僅支持2D紋理(但不包括2D數(shù)組熊户,也不支持立方體類型),沒有mipmaps和均勻width吭服。

多種像素格式存儲(chǔ)具有sRGB顏色空間值的顏色分量(例如嚷堡,MTLPixelFormatRGBA8Unorm_sRGBMTLPixelFormatETC2_RGB8_sRGB)。當(dāng)采樣操作引用具有sRGB像素格式的紋理時(shí)艇棕,Metal實(shí)現(xiàn)會(huì)在采樣操作發(fā)生之前將sRGB顏色空間分量轉(zhuǎn)換為線性顏色空間蝌戒。從sRGB組件S到線性組件L的轉(zhuǎn)換如下:

如果S <= 0.04045,則L = S / 12.92
如果S> 0.04045沼琉,則L =((S + 0.055)/1.055)2.4

相反北苟,當(dāng)渲染為使用具有sRGB像素格式的紋理的顏色可渲染附件時(shí),實(shí)現(xiàn)將線性顏色值轉(zhuǎn)換為sRGB打瘪,如下所示:

如果L <= 0.0031308友鼻,則S = L * 12.92
如果L> 0.0031308,則S =(1.055 * L0.41667) - 0.055

有關(guān)用于渲染的像素格式的更多信息闺骚,請參閱Creating a Render Pass Descriptor彩扔。


Creating a Sampler States Object for Texture Lookup - 為紋理查找創(chuàng)建采樣器狀態(tài)對象

MTLSamplerState對象定義在圖形或計(jì)算函數(shù)對MTLTexture對象執(zhí)行紋理采樣操作時(shí)使用的尋址,過濾和其他屬性僻爽。采樣器描述符定義采樣器狀態(tài)對象的屬性虫碉。要?jiǎng)?chuàng)建采樣器狀態(tài)對象:

您可以重用sampler描述符對象來創(chuàng)建更多MTLSamplerState對象,根據(jù)需要修改描述符的屬性值济蝉。描述符的屬性僅在對象創(chuàng)建期間使用。創(chuàng)建采樣器狀態(tài)后菠发,更改其描述符中的屬性不再對該采樣器狀態(tài)產(chǎn)生影響王滤。

Listing 3-4是一個(gè)代碼示例,它創(chuàng)建MTLSamplerDescriptor并對其進(jìn)行配置以創(chuàng)建MTLSamplerState滓鸠。為描述符對象的過濾器和地址模式屬性設(shè)置非默認(rèn)值雁乡。然后newSamplerStateWithDescriptor:方法使用sampler描述符來創(chuàng)建一個(gè)采樣器狀態(tài)對象

Listing 3-4  Creating a Sampler State Object

// create MTLSamplerDescriptor
MTLSamplerDescriptor *desc = [[MTLSamplerDescriptor alloc] init];
desc.minFilter = MTLSamplerMinMagFilterLinear;
desc.magFilter = MTLSamplerMinMagFilterLinear;
desc.sAddressMode = MTLSamplerAddressModeRepeat;
desc.tAddressMode = MTLSamplerAddressModeRepeat;
//  all properties below have default values
desc.mipFilter        = MTLSamplerMipFilterNotMipmapped;
desc.maxAnisotropy    = 1U;
desc.normalizedCoords = YES;
desc.lodMinClamp      = 0.0f;
desc.lodMaxClamp      = FLT_MAX;
// create MTLSamplerState
id <MTLSamplerState> sampler = [device newSamplerStateWithDescriptor:desc];

Maintaining Coherency Between CPU and GPU Memory - 保持CPU和GPU內(nèi)存之間的一致性

CPU和GPU都可以訪問MTLResource對象的底層存儲(chǔ)。但是糜俗,GPU與主機(jī)CPU異步操作踱稍,因此在使用主機(jī)CPU訪問這些資源的存儲(chǔ)時(shí)請記住以下幾點(diǎn)。

執(zhí)行MTLCommandBuffer對象時(shí)悠抹,MTLDevice對象僅保證觀察主機(jī)CPU對該MTLCommandBuffer對象引用的任何MTLResource對象的存儲(chǔ)分配所做的任何更改珠月,如果(并且僅當(dāng))主機(jī)CPU在MTLCommandBuffer對象已提交之前進(jìn)行了這些更改。也就是說楔敌,MTLDevice對象可能不會(huì)觀察到在提交相應(yīng)的MTLCommandBuffer對象之后主機(jī)CPU所做的資源的更改(即啤挎,MTLCommandBuffer對象的status屬性是MTLCommandBufferStatusCommitted)。

類似地卵凑,在MTLDevice對象執(zhí)行MTLCommandBuffer對象之后庆聘,如果命令緩沖區(qū)已完成執(zhí)行(即MTLCommandBuffer對象的status屬性是MTLCommandBufferStatusCompleted),則主機(jī)CPU僅保證觀察MTLDevice對象對該命令緩沖區(qū)引用的任何資源的存儲(chǔ)分配所做的任何更改 )勺卢。

后記

本篇主要講述了Metal編程指南之資源對象:緩沖區(qū)和紋理伙判,感興趣的給個(gè)贊或者關(guān)注~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市黑忱,隨后出現(xiàn)的幾起案子宴抚,更是在濱河造成了極大的恐慌,老刑警劉巖杨何,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酱塔,死亡現(xiàn)場離奇詭異,居然都是意外死亡危虱,警方通過查閱死者的電腦和手機(jī)羊娃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來埃跷,“玉大人蕊玷,你說我怎么就攤上這事邮利。” “怎么了垃帅?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵延届,是天一觀的道長。 經(jīng)常有香客問我贸诚,道長方庭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任酱固,我火速辦了婚禮械念,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘运悲。我一直安慰自己龄减,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布班眯。 她就那樣靜靜地躺著希停,像睡著了一般。 火紅的嫁衣襯著肌膚如雪署隘。 梳的紋絲不亂的頭發(fā)上宠能,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機(jī)與錄音定踱,去河邊找鬼棍潘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛崖媚,可吹牛的內(nèi)容都是我干的亦歉。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼畅哑,長吁一口氣:“原來是場噩夢啊……” “哼肴楷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起荠呐,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤赛蔫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后泥张,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呵恢,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年媚创,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了渗钉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鳄橘,靈堂內(nèi)的尸體忽然破棺而出声离,到底是詐尸還是另有隱情,我是刑警寧澤瘫怜,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布术徊,位于F島的核電站,受9級特大地震影響鲸湃,放射性物質(zhì)發(fā)生泄漏赠涮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一暗挑、第九天 我趴在偏房一處隱蔽的房頂上張望世囊。 院中可真熱鬧,春花似錦窿祥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至墙歪,卻和暖如春听系,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背虹菲。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工靠胜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人毕源。 一個(gè)月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓浪漠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親霎褐。 傳聞我的和親對象是個(gè)殘疾皇子址愿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

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