iOS開發(fā)快速了解OpenGL基本概念

??作為一個(gè)一個(gè)iOS底層開發(fā)小白尺铣,一直以來(lái)對(duì)于底層原理颂暇,都是一知半解的狀態(tài),希望從此時(shí)記錄自己學(xué)習(xí)底層知識(shí)的過(guò)程窗骑,也希望對(duì)其他開發(fā)中可以有一個(gè)好的幫助女责,因?yàn)樽约嚎雌渌说牟┛蜁r(shí)候,大多數(shù)作者都是基于自己認(rèn)知的前提下创译,記錄自己的知識(shí)抵知,在我看來(lái)對(duì)于入門的人來(lái)說(shuō),非常晦澀難懂刷喜,所以希望自己的文章残制,可以更加幫助其他人循序漸進(jìn)的了解更多關(guān)于iOS的知識(shí)。文章也會(huì)盡量一步步的探索更多業(yè)務(wù)開發(fā)之外的東西掖疮,對(duì)于任何方面的技能初茶,都可以友善的幫助后來(lái)的開發(fā)者。文章中有任何錯(cuò)誤浊闪,不恰當(dāng)?shù)牡胤椒那瑲g迎隨時(shí)指正,多多交流才可以共同進(jìn)步规揪。想要學(xué)習(xí) OpenGL首先需要了解OpenGL/OpenGL ES/Metal三者之間的聯(lián)系:

OpenGL(Open Graphics Library)OpenGL是一個(gè)跨平臺(tái)的編程程序接口桥氏,它將計(jì)算機(jī)的資源抽象成了一個(gè)個(gè)OpenGL對(duì)象,對(duì)這些資源的操作抽象為一個(gè)個(gè)的OpenGL指令猛铅。
OpenGL ES(OpenGL for Embedded Systems)OpenGL ES是OpenGL三維圖形API的子集字支,針對(duì)手機(jī)、PDA和游戲主機(jī)等嵌入式設(shè)備而設(shè)計(jì)奸忽,去除了許多不必要的和性能較低的API接口堕伪。
Metal:為了發(fā)展自己的渲染技術(shù),提升自己的渲染性能栗菜,Apple公司在2014年推出了自己的渲染技術(shù)平臺(tái)Metal欠雌,該技術(shù)能夠?yàn)?D圖像提高10倍的渲染性能。

??通俗來(lái)講就是疙筹,Apple作為大廠富俄,肯定要發(fā)展自己的底層渲染技術(shù),所以推出了Metal而咆,在推出Metal之前霍比,蘋果的底層渲染也是基于OpenGL/OpenGL ES的,在iOS12.0以后暴备,蘋果摒棄了OpenGL的相關(guān)API悠瞬,使用Metal作為自己的渲染技術(shù),但是OpenGL相關(guān)的API依然可以使用涯捻,因?yàn)樵?code>Metal之前浅妆,蘋果提供了非常豐富的關(guān)于使用OpenGL相關(guān)API,類似于蘋果推出了swift障癌,但是OC依然是自己主流語(yǔ)言一樣凌外。了解了相關(guān)的背景,我們接下來(lái)要知道圖形API究竟是用來(lái)解決什么樣的問(wèn)題存在的混弥。

A. 比如說(shuō)在游戲開發(fā)中趴乡,對(duì)于游戲場(chǎng)景/游戲人物的渲染
B. 比如在音頻開發(fā)中,對(duì)于視頻解碼后的數(shù)據(jù)渲染
C. 比如在地圖引擎蝗拿,對(duì)于地圖上的數(shù)據(jù)渲染
D. 比如在動(dòng)畫中晾捏,實(shí)現(xiàn)動(dòng)畫的繪制
E. 比如在視頻處理中,對(duì)于視頻加入濾鏡效果等

??OpenGL/OpenGL ES/Metal在任何項(xiàng)目中解決問(wèn)題的本質(zhì)就是利用GPU芯片來(lái)高效的渲染圖形圖像哀托。圖形APIiOS開發(fā)者唯一接近GPU的方式惦辛。想要了解OpenGL就要先學(xué)習(xí)關(guān)于OpenGL的專業(yè)名詞,了解了這些仓手,才可以對(duì)以后的學(xué)習(xí)胖齐,有更加深刻的認(rèn)識(shí)。

OpenGL專業(yè)名詞解析

上下文

? 在應(yīng)?程序調(diào)?任何OpenGL的指令之前嗽冒,需要安排?先創(chuàng)建?個(gè)OpenGL的上下?呀伙。這個(gè)上下?是?個(gè)?常龐?的狀態(tài)機(jī),保存了OpenGL中的各種狀態(tài)添坊,這也是OpenGL指令執(zhí)?的基礎(chǔ)剿另。
? OpenGL的函數(shù)不管在哪個(gè)語(yǔ)?中,都是類似C語(yǔ)??樣的?向過(guò)程的函數(shù)贬蛙,本質(zhì)上都是對(duì)OpenGL上下?這個(gè)龐?的狀態(tài)機(jī)中的某個(gè)狀態(tài)或者對(duì)象進(jìn)?操作雨女,當(dāng)然你得?先把這個(gè)對(duì)象設(shè)置為當(dāng)前對(duì)象。因此阳准,通過(guò)對(duì)OpenGL指令的封裝氛堕,是可以將OpenGL的相關(guān)調(diào)用封裝成為一個(gè)面向?qū)ο蟮膱D形API
? 由于OpenGL上下?是?個(gè)巨?的狀態(tài)機(jī)野蝇,切換上下?往往會(huì)產(chǎn)?較?的開銷讼稚,但是不同的繪制模塊,可能需要使?完全獨(dú)?的狀態(tài)管理绕沈。因此乱灵,可以在應(yīng)?程序中分別創(chuàng)建多個(gè)不同的上下?,在不同線程中使?不同的上下?七冲,上下?之間共享紋理痛倚、緩沖區(qū)等資源。這樣的?案澜躺,會(huì)?反復(fù)切換上下?蝉稳,或者?量修改渲染狀態(tài),更加合理?效的.

狀態(tài)機(jī)

? 狀態(tài)機(jī)是理論上的?種機(jī)器.這個(gè)?常難以理解.所以我們把這個(gè)狀態(tài)機(jī)這么理解.狀態(tài)機(jī)描述了?對(duì)象在其?命周期內(nèi)所經(jīng)歷的各種狀態(tài)掘鄙,狀態(tài)間的轉(zhuǎn)變耘戚,發(fā)?轉(zhuǎn)變的動(dòng)因,條件及轉(zhuǎn)變中所執(zhí)?的活動(dòng)操漠∈战颍或者說(shuō)饿这,狀態(tài)機(jī)是?種?為,說(shuō)明對(duì)象在其?命周期中響應(yīng)事件所經(jīng)歷的狀態(tài)序列以及對(duì)那些狀態(tài)事件的響應(yīng)撞秋。因此具有以下特點(diǎn):
a有記憶功能长捧,能記住其當(dāng)前的狀態(tài)
b 可以接收輸?,根據(jù)輸?的內(nèi)容和??的原先狀態(tài)吻贿,修改??當(dāng)前狀態(tài)串结,并且可以有對(duì)應(yīng)輸出
c 當(dāng)進(jìn)?特殊狀態(tài)(停機(jī)狀態(tài))的時(shí)候,變不再接收輸?舅列,停??作肌割;

??狀態(tài)機(jī)在OpenGL可以這么理解,OpenGL可以記錄自己的狀態(tài)(當(dāng)前所使用的顏色帐要、是否開啟了混合功能等)把敞,可以接輸入(當(dāng)調(diào)用OpenGL函數(shù)的時(shí)候,實(shí)際上可以看成OpenGL在接受我們的輸入)榨惠,如我們調(diào)用glColor3f先巴,則OpenGL接收到這個(gè)輸入后會(huì)修改自己的“當(dāng)前顏色”這個(gè)狀態(tài),OpenGL可以進(jìn)入停止?fàn)顟B(tài)冒冬,不再接收輸入伸蚯。在程序退出前,OpenGL總會(huì)先停止工作简烤;

頂點(diǎn)數(shù)組[VertexArray]和頂點(diǎn)緩沖區(qū)[VertexBuffer]

? 畫圖?般是先畫好圖像的?架剂邮,然后再往?架??填充顏?,這對(duì)于OpenGL也是?樣的横侦。頂點(diǎn)數(shù)據(jù)就是要畫的圖像的?架挥萌,和現(xiàn)實(shí)中不同的是,OpenGL中的圖像都是由圖元組成枉侧。在OpenGLES中引瀑,有3種類型的圖元:點(diǎn)、線榨馁、三?形憨栽。那這些頂點(diǎn)數(shù)據(jù)最終是存儲(chǔ)在哪?的呢?開發(fā)者可以選擇設(shè)定函數(shù)指針翼虫,在調(diào)?繪制?法的時(shí)候屑柔,直接由內(nèi)存?zhèn)?頂點(diǎn)數(shù)據(jù),也就是說(shuō)這部分?jǐn)?shù)據(jù)之前是存儲(chǔ)在內(nèi)存當(dāng)中的珍剑,被稱為頂點(diǎn)數(shù)組掸宛。?性能更?的做法是,提前分配?塊顯存招拙,將頂點(diǎn)數(shù)據(jù)預(yù)先傳?到顯存當(dāng)中唧瘾。這部分的顯存措译,就被稱為頂點(diǎn)緩沖區(qū)。頂點(diǎn)緩存區(qū)在顯卡顯存中饰序。
? 頂點(diǎn)指的是我們?cè)诶L制?個(gè)圖形時(shí),它的頂點(diǎn)位置數(shù)據(jù).?這個(gè)數(shù)據(jù)可以直接存儲(chǔ)在數(shù)組中或者將其緩存到GPU內(nèi)存中.

管線

管線:在OpenGL下渲染圖形,就會(huì)有經(jīng)歷?個(gè)?個(gè)節(jié)點(diǎn).?這樣的操作可以理解管線领虹。?家可以想象成流?線,每個(gè)任務(wù)類似流?線般執(zhí)?菌羽,任務(wù)之間有先后順序掠械, 管線是?個(gè)抽象的概念由缆,之所以稱之為管線是因?yàn)轱@卡在處理數(shù)據(jù)的時(shí)候是按照?個(gè)固定的順序來(lái)的注祖,?且嚴(yán)格按照這個(gè)順序。就像?從?根管?的?端流到另?端均唉,這個(gè)順序是不能打破的是晨。

固定管線/存儲(chǔ)著?器

? 在早期的OpenGL版本,它封裝了很多種著?器程序塊內(nèi)置的?段包含了光照、坐標(biāo)變換舔箭、裁剪等等諸多功能的固定Shader程序來(lái)完成,來(lái)幫助開發(fā)者來(lái)完成圖形的渲染. ?開發(fā)者只需要傳?相應(yīng)的參數(shù),就能快速完成圖形的渲染. 類似于iOS開發(fā)會(huì)封裝很多API,?我們只需要調(diào)?,就可以實(shí)現(xiàn)功能.不需要關(guān)注底層實(shí)現(xiàn)原理罩缴。
? 但是由于OpenGL的使?場(chǎng)景?常豐富,固定管線或存儲(chǔ)著?器?法完成每?個(gè)業(yè)務(wù).這時(shí)將相關(guān)部分開放成可編程。

著色器程序Shader

? 就全?的將固定渲染管線架構(gòu)變?yōu)榱丝删幊啼秩竟芫€层扶。因此箫章,OpenGL在實(shí)際調(diào)?繪制函數(shù)之前,還需要指定?個(gè)由Shader編譯成的著?器程序镜会。常?的著?器主要有頂點(diǎn)著?器(VertexShader)檬寂,?段著?器(FragmentShader)/像素著?器(PixelShader),?何著?器(GeometryShader)戳表,曲?細(xì)分著?器(TessellationShader)桶至。?段著?器和像素著?器只是在OpenGLDX中的不同叫法?已∝倚瘢可惜的是镣屹,直到OpenGLES 3.0,依然只?持了頂點(diǎn)著?器和?段著?器這兩個(gè)最基礎(chǔ)的著?器价涝。
? OpenGL在處理shader時(shí)女蜈,和其他編譯器?樣。通過(guò)編譯色瘩、鏈接等步驟鞭光,?成了著?器程序(glProgram),著?器程序同時(shí)包含了頂點(diǎn)著?器和?段著?器的運(yùn)算邏輯泞遗。在OpenGL進(jìn)?繪制的時(shí)候惰许,?先由頂點(diǎn)著?器對(duì)傳?的頂點(diǎn)數(shù)據(jù)進(jìn)?運(yùn)算。再通過(guò)圖元裝配史辙,將頂點(diǎn)轉(zhuǎn)換為圖元汹买。然后進(jìn)?光柵化佩伤,將圖元這種?量圖形,轉(zhuǎn)換為柵格化數(shù)據(jù)晦毙。最后生巡,將柵格化數(shù)據(jù)傳??段著?器中進(jìn)?運(yùn)算。?段著?器會(huì)對(duì)柵格化數(shù)據(jù)中的每?個(gè)像素進(jìn)?運(yùn)算见妒,并決定像素的顏?孤荣。

頂點(diǎn)著?器(VertexShader)

? ?般?來(lái)處理圖形每個(gè)頂點(diǎn)變換(旋轉(zhuǎn)/平移/投影等)
? 頂點(diǎn)著?器是OpenGL中?于計(jì)算頂點(diǎn)屬性的程序。頂點(diǎn)著?器是逐頂點(diǎn)運(yùn)算的程序须揣,也就是說(shuō)每個(gè)頂點(diǎn)數(shù)據(jù)都會(huì)執(zhí)??次頂點(diǎn)著?器盐股,當(dāng)然這是并?的,并且頂點(diǎn)著?器運(yùn)算過(guò)程中?法訪問(wèn)其他頂點(diǎn)的數(shù)據(jù)耻卡。
? ?般來(lái)說(shuō)典型的需要計(jì)算的頂點(diǎn)屬性主要包括頂點(diǎn)坐標(biāo)變換疯汁、逐頂點(diǎn)光照運(yùn)算等等。頂點(diǎn)坐標(biāo)由?身坐標(biāo)系轉(zhuǎn)換到歸?化坐標(biāo)系的運(yùn)算卵酪,就是在這?發(fā)?的幌蚊。

?元/片段/像素著?器程序(FragmentShader)

? ?般?來(lái)處理圖形中每個(gè)像素點(diǎn)顏?計(jì)算和填充。
? ?段著?器是OpenGL中?于計(jì)算?段(像素)顏?的程序溃卡。?段著?器是逐像素運(yùn)算的程序溢豆,也就是說(shuō)每個(gè)像素都會(huì)執(zhí)??次?段著?器,當(dāng)然也是并?的瘸羡。

GLSL(OpenGL Shading Language)

? OpenGL著?語(yǔ)?(OpenGL Shading Language)是?來(lái)在OpenGL中著?編程的語(yǔ)?漩仙,也即開發(fā)?員寫的短?的?定義程序,他們是在圖形卡的GPUGraphic Processor Unit圖形處理單元)上執(zhí)?的最铁,代替了固定的渲染管線的?部分讯赏,使渲染管線中不同層次具有可編程性。?如:視圖轉(zhuǎn)換冷尉、投影轉(zhuǎn)換等漱挎。GLSL(GL Shading Language)的著?器代碼分成2個(gè)部分:Vertex Shader(頂點(diǎn)著?器)和Fragment(?斷著?器)。

光柵化(Rasterization)

? 是把頂點(diǎn)數(shù)據(jù)轉(zhuǎn)換為?元的過(guò)程雀哨,具有將圖轉(zhuǎn)化為?個(gè)個(gè)柵格組成的圖象的作?磕谅,特點(diǎn)是每個(gè)元素對(duì)應(yīng)幀緩沖區(qū)中的?像素。
? 光柵化就是把頂點(diǎn)數(shù)據(jù)轉(zhuǎn)換為?元的過(guò)程雾棺,?元中的每?個(gè)元素對(duì)應(yīng)于幀緩沖區(qū)中的?個(gè)像素膊夹。
? 光柵化其實(shí)是?種將?何圖元變?yōu)?維圖像的過(guò)程。該過(guò)程包含了兩部分的?作捌浩。第?部分?作:決定窗?坐標(biāo)中的哪些整型柵格區(qū)域被基本圖元占?放刨;第?部分?作:分配?個(gè)顏?值和?個(gè)深度值到各個(gè)區(qū)域。光柵化過(guò)程產(chǎn)?的是?元尸饺。
? 把物體的數(shù)學(xué)描述以及與物體相關(guān)的顏?信息轉(zhuǎn)換為屏幕上?于對(duì)應(yīng)位置的像素及?于填充像素的顏?进统,這個(gè)過(guò)程稱為光柵化助币,這是?個(gè)將模擬信號(hào)轉(zhuǎn)化為離散信號(hào)的過(guò)程。

紋理

? 紋理可以理解為圖?螟碎,?家在渲染圖形時(shí)需要在其編碼填充圖?眉菱,為了使得場(chǎng)景更加逼真。?這?使?的圖?掉分,就是常說(shuō)的紋理俭缓,但是在OpenGL,我們更加習(xí)慣叫紋理,?不是圖?酥郭。

混合(Blending)

? 在測(cè)試階段之后华坦,如果像素依然沒(méi)有被剔除,那么像素的顏?將會(huì)和幀緩沖區(qū)中顏?附著上的顏?進(jìn)?混合褥民,混合的算法可以通過(guò)OpenGL的函數(shù)進(jìn)?指定季春。但是OpenGL提供的混合算法是有限的洗搂,如果需要更加復(fù)雜的混合算法消返,?般可以通過(guò)像素著?器進(jìn)?實(shí)現(xiàn),當(dāng)然性能會(huì)?原?的混合算法差?些耘拇。

變換矩陣(Transformation)

? 例如圖形想發(fā)?平移,縮放,旋轉(zhuǎn)變換.就需要使?變換矩陣撵颊。

投影矩陣(Projection)

? ?于將3D坐標(biāo)轉(zhuǎn)換為?維屏幕坐標(biāo),實(shí)際線條也將在?維坐標(biāo)下進(jìn)?繪制。

視口惫叛、窗口

? 視口是與設(shè)備相關(guān)的一個(gè)矩形區(qū)域倡勇,坐標(biāo)單位是與設(shè)備相關(guān)的“像素”,大多數(shù)情況下嘉涌,視口與客戶區(qū)相同妻熊。窗口的坐標(biāo)是邏輯坐標(biāo),與設(shè)備無(wú)關(guān)仑最,可能是像素扔役、毫米或者英寸。窗口坐標(biāo)的原點(diǎn)與視口坐標(biāo)的原點(diǎn)始終對(duì)應(yīng)于同一點(diǎn)警医。對(duì)于同一個(gè)圖形亿胸,用窗口坐標(biāo)系統(tǒng)表達(dá)的該區(qū)域的長(zhǎng)和寬與視口的坐標(biāo)系統(tǒng)表達(dá)的長(zhǎng)和寬是不同的。二者就定義了這兩個(gè)坐標(biāo)系統(tǒng)的比例關(guān)系预皇。程序作圖時(shí)侈玄,使用的坐標(biāo)總是是窗口坐標(biāo)。而實(shí)際的顯示或輸出設(shè)備卻各有自己的坐標(biāo)吟温。視口是設(shè)備自己的坐標(biāo)序仙,窗口是邏輯坐標(biāo)

渲染上屏/交換緩沖區(qū)(SwapBuffer)

? 渲染緩沖區(qū)?般映射的是系統(tǒng)的資源?如窗?。如果將圖像直接渲染到窗?對(duì)應(yīng)的渲染緩沖區(qū)鲁豪,則可以將圖像顯示到屏幕上潘悼。
? 但是洋丐,值得注意的是,如果每個(gè)窗?只有?個(gè)緩沖區(qū)挥等,那么在繪制過(guò)程中屏幕進(jìn)?了刷新友绝,窗?可能顯示出不完整的圖像
? 為了解決這個(gè)問(wèn)題,常規(guī)的OpenGL程序?少都會(huì)有兩個(gè)緩沖區(qū)肝劲。顯示在屏幕上的稱為屏幕緩沖區(qū)迁客,沒(méi)有顯示的稱為離屏緩沖區(qū)。在?個(gè)緩沖區(qū)渲染完成之后辞槐,通過(guò)將屏幕緩沖區(qū)和離屏緩沖區(qū)交換掷漱,實(shí)現(xiàn)圖像在屏幕上的顯示。
? 由于顯示器的刷新?般是逐?進(jìn)?的榄檬,因此為了防?交換緩沖區(qū)的時(shí)候屏幕上下區(qū)域的圖像分屬于兩個(gè)不同的幀卜范,因此交換?般會(huì)等待顯示器刷新完成的信號(hào),在顯示器兩次刷新的間隔中進(jìn)?交換鹿榜,這個(gè)信號(hào)就被稱為垂直同步信號(hào)政鼠,這個(gè)技術(shù)被稱為垂直同步
? 使?了雙緩沖區(qū)和垂直同步技術(shù)之后,由于總是要等待緩沖區(qū)交換之后再進(jìn)?下?幀的渲染狭莱,使得幀率?法完全達(dá)到硬件允許的最??平就轧。為了解決這個(gè)問(wèn)題,引?了三緩沖區(qū)技術(shù)沪袭,在等待垂直同步時(shí)湾宙,來(lái)回交替渲染兩個(gè)離屏的緩沖區(qū),?垂直同步發(fā)?時(shí)冈绊,屏幕緩沖區(qū)和最近渲染完成的離屏緩沖區(qū)交換侠鳄,實(shí)現(xiàn)充分利?硬件性能的?的

??這里有一個(gè)iOS中很經(jīng)常聽到的概念,離屏渲染死宣,很多人知道離屏渲染會(huì)對(duì)APP的性能造成較大的開銷伟恶,但是卻不知道原理是什么,相信大家了解了上面關(guān)于OpenGL關(guān)于交換緩沖區(qū)的概念后十电,有了一個(gè)更清晰的認(rèn)識(shí)知押,即:Off-Screen Rendering是需要開辟新的緩沖區(qū)的,不停地切換上下文的環(huán)境則是對(duì)性能的很大的消耗鹃骂,所以在iOS開發(fā)中台盯,我們應(yīng)當(dāng)盡量的避免離屏渲染。
??在學(xué)習(xí)OpenGL的過(guò)程中畏线,直接非常直觀的掌握并理解這些概念并不是一件容易的事静盅,但是至少需要在入門階段,大致的了解這些概念的意思,然后通過(guò)后續(xù)的學(xué)習(xí)蒿叠,慢慢的鞏固前面學(xué)到的知識(shí)明垢,溫故而知新,一步步的打開關(guān)于iOS底層渲染知識(shí)的大門市咽,學(xué)習(xí)的越來(lái)越深入痊银,慢慢的回過(guò)頭看以前的知識(shí)點(diǎn)的時(shí)候,就會(huì)豁然開朗了施绎。
??希望能一步步的記錄自己學(xué)習(xí)的過(guò)程溯革,慢慢進(jìn)步,慢慢成長(zhǎng)谷醉,文章中有任何錯(cuò)誤的地方致稀,歡迎指正。希望能多多交流俱尼,共同進(jìn)步抖单。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市遇八,隨后出現(xiàn)的幾起案子矛绘,更是在濱河造成了極大的恐慌,老刑警劉巖押蚤,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔑歌,死亡現(xiàn)場(chǎng)離奇詭異羹应,居然都是意外死亡揽碘,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門园匹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)雳刺,“玉大人,你說(shuō)我怎么就攤上這事裸违∫磋耄” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵供汛,是天一觀的道長(zhǎng)枪汪。 經(jīng)常有香客問(wèn)我,道長(zhǎng)怔昨,這世上最難降的妖魔是什么雀久? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮趁舀,結(jié)果婚禮上赖捌,老公的妹妹穿的比我還像新娘。我一直安慰自己矮烹,他們只是感情好越庇,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布罩锐。 她就那樣靜靜地躺著,像睡著了一般卤唉。 火紅的嫁衣襯著肌膚如雪涩惑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天桑驱,我揣著相機(jī)與錄音境氢,去河邊找鬼。 笑死碰纬,一個(gè)胖子當(dāng)著我的面吹牛萍聊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悦析,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼寿桨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了强戴?” 一聲冷哼從身側(cè)響起亭螟,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎骑歹,沒(méi)想到半個(gè)月后预烙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡道媚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年扁掸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片最域。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谴分,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出镀脂,到底是詐尸還是另有隱情牺蹄,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布薄翅,位于F島的核電站沙兰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏翘魄。R本人自食惡果不足惜鼎天,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望熟丸。 院中可真熱鬧训措,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至呀闻,卻和暖如春化借,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捡多。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工蓖康, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人垒手。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓蒜焊,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親科贬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泳梆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344