OpenGL渲染基礎(chǔ)

一毙沾、基礎(chǔ)圖形管線

渲染管線(rendering pipeline - 它是一系列數(shù)據(jù)處理過程钟沛,并且將應(yīng)用程序的數(shù)據(jù)轉(zhuǎn)換到最終渲染的圖像迫肖。下圖是OpenGL 4.3 版本的管線判族。

opengl01.png
opengl02.png

OpenGL 中的 圖元 只不過是頂點的集合以預定義的方式結(jié)合在一起罷了奖恰。

通過最近學習 OpenGL 的藍寶書(《OpenGL超級寶典》)钩述,學到了基礎(chǔ)渲染這塊寨躁,為了加深理解,按照書中優(yōu)化了一下渲染管線的流程圖牙勘,并在圖中添加上了翻譯和自己的理解职恳,加深自己的印象并幫助更多學習 OpenGL 的朋友們更好的學習。

OpenGL渲染管線簡化流程圖:

opengl03.png

1方面、客戶端-服務(wù)器

管線上半部分是客戶端放钦,下半部分是服務(wù)器。就 OpenGL 而言恭金,客戶端是存儲在 CPU 存儲器中的操禀,驅(qū)動程序?qū)秩久钆c數(shù)據(jù)組合起來發(fā)給服務(wù)器執(zhí)行。
服務(wù)器和客戶端在功能上是異步的横腿⊥切迹客戶端不斷的將數(shù)據(jù)和命令組合在一起送入緩沖區(qū)禾进,緩沖區(qū)再發(fā)送到服務(wù)器執(zhí)行茁瘦。

2借笙、著色器

上圖中最大的框代表的是** 頂點著色器** 和 片元著色器祥款。著色器是使用GLSL編寫的程序。
頂點著色器:頂點著色器處理從客戶端輸入的數(shù)據(jù)丹擎,用數(shù)學運算來計算光照效果尾抑、位移歇父、顏色值等蒂培。有幾個頂點,頂點著色器就要執(zhí)行幾次榜苫。
上圖中的 圖元組合(Primitive Assembly)框圖意在說明3個頂點已經(jīng)組合在了一起护戳。
片元著色器:片元著色器來計算片元的最終顏色(盡管在下一個階段(逐片元的操作)時可能還會改變顏色一次)和它的深度值。在這里我們會使用紋理映射的方式垂睬,對頂點處理階段所計算的顏色值進行補充媳荒。如果我們覺得不應(yīng)該繼續(xù)繪制某個片元,在片元著色器中還可以終止這個片元的處理驹饺,這一步叫做片元的丟棄(discard)钳枕。
頂點的著色器和片元著色器之間的區(qū)別: 頂點著色(包括細分和幾何著色)決定了一個圖元應(yīng)該位于屏幕的什么位置,而片元著色使用這些信息來決定某個片元的顏色應(yīng)該是什么赏壹。

著色器的渲染:
頂點著色器(必要)
細分著色器(可選)
幾何著色器(可選)
片元著色器(必要)

3鱼炒、三種向OpenGL 著色器傳遞渲染數(shù)據(jù)的?法

屬性:就是對?個頂點都要作出改變的數(shù)據(jù)元素。實際上蝌借,頂點位置本身就是一個屬性.昔瞧。屬性可以是浮點類型,整型菩佑,布爾類型等自晰。

Uniform值:通過設(shè)置 Uniform 變量就緊接著發(fā)送一個圖元批次處理命令。Uniform 變量實際上可以無限次的使?稍坯。 設(shè)置一個應(yīng)用于整個表?面的單個顏色值酬荞,還可也是一個時間值。

使用下面的函數(shù):

// Use a stock shader, and pass in the parameters needed
GLint UseStockShader(GLT_STOCK_SHADER nShaderID, ...);

傳遞不同的 Uniform 參數(shù)可以使用不同的存儲著色器:
首先定義一個顏色黑色 vBlack:

GLfloat vBlack[] = { 0.0f, 0.0f, 0.0f, 1.0f };

聲明一個全局的存儲著色器變量 shaderManager:

GLShaderManager     shaderManager;
shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vBlack);

//使用 單位著色器
//參數(shù)1:簡單的使用默認笛卡爾坐標系(-1瞧哟,1)混巧,所有片段都應(yīng)用一種顏色。GLT_SHADER_IDENTITY
//參數(shù)2:著色器顏色
shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vGreen);

GLShaderManger::UseStockShader(GLT_SHADER_IDENTITY,GLfloat mvp[16],GLfloat vColor[4])

紋理:對紋理進行采樣和篩選绢涡。紋理數(shù)據(jù)的作用不僅僅是表現(xiàn)圖形牲剃。很多圖形文件格式都是以無符號字節(jié)形式對顏色分量進行存儲的,但我們?nèi)匀豢梢栽O(shè)置浮點紋理雄可。這就是說凿傅,任何大型浮點數(shù)據(jù)塊(例如消耗資源很大的函數(shù)的大型查詢表)都可以通過這種方式傳遞給著色器缠犀。

4、使用存儲著色器

在OpenGL 核心框架中聪舒,并沒提供任何內(nèi)建渲染管線辨液,在提交一個幾何圖形進行渲染之前,必須實現(xiàn)一個著色器箱残。著色器由GLTools 的 C++ 類 GLShaderManager 管理滔迈。他們能夠滿足進行基本渲染的基本要求,要求不高的程序員被辑,這些存儲著色器已經(jīng)足以滿足他們的需求燎悍。但隨著時間和經(jīng)驗的提升,大部分開發(fā)者可能不滿足于此盼理,會著手去寫著色器谈山,手寫的我會在以后的文章里再寫出來。

4.1著色器的使用

  1. GLShaderManager 的初始化:
GLShaderManager     shaderManager;
shaderManager.InitializeStockShaders();
  1. GLShaderManager 屬性:
    存儲著色器為每個變量都使用一致的內(nèi)部變量命名規(guī)則和相同的屬性槽(Attribute Slot)宏怔。下表列出了這些屬性:
    表-GLShaderManager 預定義的標識符
標識符 描述
GLT_ATTRIBUTE_VERTEX 3分量(x, y, z)頂點位置
GLT_ATTRIBUTE_COLOR 4分量(r, g, b, a)顏色值
GLT_ATTRIBUTE_NORMAL 3分量(x, y, z)表面法線
GLT_ATTRIBUTE_TEXTURE0 第一對 2 分量(s ,t)紋理坐標
GLT_ATTRIBUTE_TEXTURE1 第二對 2 分量(s ,t)紋理坐標

4.2 GLShanderManager 的 uniform 值

一般情況奏路,要對幾何圖形進行渲染,我們需要為讀寫遞交屬性矩陣臊诊,首先要綁定到我們想要使用的著色程序上鸽粉,并提供程序的 Uniform 值。GLShanderManager 類可以(暫時)為我們完成這項工作抓艳。
useStockShader 函數(shù)會選擇一個存儲著色器并提供這個著色器的 Uniform 值触机,這些工作通過一次函數(shù)調(diào)用就能完成:

GLShaderManager::UseStockShader(GLenum shader, ... ...);

在 C 語言(或 C++ 語言)中,......表示函數(shù)接受一個可變的參數(shù)數(shù)量壶硅。就這個函數(shù)本身而言威兜,它根據(jù)我們選擇的著色器,從堆棧中提取正確的參數(shù)庐椒,這些參數(shù)就是特定著色器要求的 Uniform 值椒舵。

(1) 單位(Identity)著色器 GLT_SHADER_IDENTITY

參數(shù)1:單位著色器
參數(shù)2:顏色值
GLShaderManager::UseStockShader(GLT_SHADER_IDENTITY, GLfoat vColor[4]);

單位(Identity)著色器: 只是簡單地使用默認的笛卡爾坐標系(坐標范圍-1.0~1.0)。所有片段都應(yīng)用同一種顏色约谈,結(jié)合圖形為實心和未渲染的笔宿。這種著色器只使用一個屬性 GLT_ATTRIBUTE_VERTEX。vColor參數(shù)包含了要求的顏色棱诱。

(2) 平面(Flat)著色器 GLT_SHADER_FLAT

參數(shù)1:平面著色器
參數(shù)2:允許變化的4*4矩陣
參數(shù)3:顏色值
GLShaderManager::UseStockShader(GLT_SHADER_FLAT, GLfoat mvp[16], GLfloat vColor[4]);

平面(Flat)著色器:將單位著色器進行了擴展泼橘,允許為集合圖形變換指定一個 4 x 4 的變換矩陣。經(jīng)常被稱作“模型師徒投影矩陣”迈勋。這種著色器只使用一個屬性GLT_ATTRIBUTE_VERTEX炬灭。

(3) 上色(Shaded)著色器 GLT_SHADER_SHADED

GLShaderManager::UseStockShader(GLT_SHADER_SHADED, GLfoat mvp[16]);

上色(Shaded)著色器:唯一的 Uniform 值就是在幾何圖形中應(yīng)用的變換矩陣。GLT_ATTRIBUTE_VERTEX 和 **GLT_ATTRIBUTE_COLOR **在這種著色器中都會使用靡菇。顏色值將被平滑地插入頂點之間(稱為平滑著色)重归。

(4) 默認光源著色器 GLT_SHADER_DEFAULT_LIGHT

參數(shù)1:默認光源著色器
參數(shù)2:模型視圖矩陣
參數(shù)3:投影矩陣
參數(shù)4:顏色值
GLShaderManager::UseStockShader(GLT_SHADER_DEFAULT_LIGHT, GLfoat mvMatrix[16], GLfloat pMatrix[16], GLfloat vColor[4]);

默認光源著色器:這種著色器使對象產(chǎn)生陰影和光照的效果米愿。需要模型視圖矩陣、投影矩陣和作為基本色的顏色值等 Uniform 值鼻吮。所需的屬性有 GLT_ATTRIBUTE_VERTEX(頂點分量)和 GLT_ATTRIBUTE_NORMAL(表面法線)育苟。

(5) 點光源著色器 GLT_SHADER_POINT_LIGHT_DIFF

參數(shù)1:點光源著色器
參數(shù)2:模型視圖矩陣
參數(shù)3:投影矩陣
參數(shù)4:視點坐標系中的光源位置
參數(shù)5:顏色值
GLShaderManager::UseStockShader(GLT_SHADER_POINT_LIGHT_DIFF, GLfoat mvMatrix[16], GLfloat pMatrix[16], GLfloat vLightPos[3], GLfloat vColor[4]);

點光源著色器:和默認光源著色器很相似,但光源位置可能是待定的椎木。接受 4 個 Uniform 值违柏,即模型視圖矩陣、投影矩陣香椎、視點坐標系中的光源位置和對象的基本漫反射顏色漱竖。同樣所需的屬性有 GLT_ATTRIBUTE_VERTEX(頂點分量)和 GLT_ATTRIBUTE_NORMAL(表面法線)

(6) 紋理替換矩陣 GLT_SHADER_TEXTURE_REPLACE

GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_REPLACE, GLfoat mvMatrix[16], GLint nTextureUnit);

** 紋理替換矩陣:**著色器通過給定的模型視圖投影矩陣士鸥,使用綁定到 nTextureUnit(紋理單元) 指定的紋理單元的紋理對幾何圖形進行變換闲孤。片段顏色是從紋理樣本中直接獲取的谆级。所需的屬性有 GLT_ATTRIBUTE_VERTEX(頂點分量)和 GLT_ATTRIBUTE_NORMAL(表面法線)烤礁。

(7) 紋理調(diào)整著色器 GLT_SHADER_TEXTURE_MODULATE

GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_MODULATE, GLfoat mvMatrix[16], GLfloat vColor, GLint nTextureUnit);

紋理調(diào)整著色器:這種著色器將一個基本色乘以一個取自紋理單元 nTextureUnit 的紋理。所需的屬性有 GLT_ATTRIBUTE_VERTEX(頂點分量)和 GLT_ATTRIBUTE_TEXTURE0(紋理坐標)肥照。

(8) 紋理光源著色器 GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF

參數(shù)1:紋理光源著色器
參數(shù)2:模型視圖矩陣
參數(shù)3:投影矩陣
參數(shù)4:視點坐標系中的光源位置
參數(shù)5:幾何圖形的基本色
參數(shù)6:將要使用的紋理單元
GLShaderManager::UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF, GLfloat mvMatrix, GLfoat mvMatrix[16], GLfloat vLightPos[3], GLfloat vBaseColor[4], GLint nTextureUnit);

紋理光源著色器:這種著色器將一個紋理通過漫反射照明計算進行調(diào)整(相乘)脚仔,光線在視覺空間中的位置是給定的。這種著色器接受 5 個 Uniform 值舆绎,即模型視圖矩陣鲤脏、投影矩陣、視覺空間中的光源位置吕朵、幾何圖形的基本色和將要使用的紋理單元猎醇。所需的屬性有 GLT_ATTRIBUTE_VERTEX(頂點分量)、GLT_ATTRIBUTE_NORMAL(表面法線)和 GLT_ATTRIBUTE_TEXTURE0(紋理坐標)努溃。

二硫嘶、OpenGL 基礎(chǔ)圖元

OpenGL圖元的模式標識

圖元類型 OpenGL 枚舉量
GL_POINTS
GL_LINES
條帶線 GL_LINE_STRIP
循環(huán)線 GL_LINE_LOOP
獨立三角形 GL_TRIANGLES
三角形條帶 GL_TRIANGLE_STRIP
三角形扇面 GL_TRIANGLE_FAN

1、點和線

(1)點

點 是最簡單的圖像梧税。每個特定的頂點在屏幕上都僅僅是一個單獨的點沦疾。默認的情況下,點的大小是一個像素的大小第队。我們可通過調(diào)用glPointSize改變默認點的大邢:

void glPointSize(GLfloat size);
//  1.最簡單也是最常用的 4.0f,表示點的大小
   glPointSize(4.0f);
    
// 2.設(shè)置點的大小范圍和點與點之間的間隔
GLfloat sizes[2] = {2.0f,4.0f};
GLfloat step = 1.0f;

// 獲取點大小范圍和最小步長(增量)
glGetFloatv(GL_POINT_SIZE_RANGE,sizes);
glGetFloatv(GL_POINT_GRAULARITY,&step); 

還可以通過使用程序點大小模式來設(shè)置點大小。

// 3.通過使用程序點大小模式來設(shè)置點大小
glEnable(GL_PROGRAM_POINT_SIZE);
// 這種模式下允許我們通過編程在頂點著色器或幾何著色器中設(shè)置點大小凳谦。著色器內(nèi)建變量:gl_PointSize忆畅,并且可以在著色器源碼直接寫
 gl_PointSize = 5.0;

(2)線

比點更進一步的是獨立線段。一個線段就是2個頂點之間繪制的尸执。
默認情況下家凯,線段的寬度是一個像素眠屎。改變線段唯一的方式是使用函數(shù) glLineWidth:

void glLineWidth(GLfloat width);
// 設(shè)置獨立線段寬度為1.5f;
glLineWidth(1.5f);

(3)線帶

線帶(line strip)連續(xù)地從一個頂點到下一個頂點繪制的線段,以形成一個真正連接點的線條肆饶。
(為了把圖形連接起來改衩,每個連接的頂點會被選定2次。一次作為線段的終點驯镊、一次作為下一條線段的起點)葫督,這次是作為GL_LINE_STRIP繪制的。

(4)線環(huán)

線環(huán)(line loop)是線帶的一種簡單拓展板惑,在線帶的基礎(chǔ)上額外增加了一條連接著一批次中最后一個點和第一個點的線段橄镜。

2、繪制三角形

可能存在的最簡單的實體多邊形就是三角形冯乘,它只有3個邊洽胶。光柵化硬件最歡迎三角形。并且現(xiàn)在OpenGL已經(jīng)是OpenGL中支持的唯一一種多邊形裆馒。每3個頂點定義一個新的三角形姊氓。

(1)單獨的三角形

如下圖是使用 GL_TRIANGLES 繪制的兩個三角形:

opengl04.png

繪制金字塔

下面繪制4個三角形組成金字塔形的三角形。我們可以使用方向鍵來旋轉(zhuǎn)金字塔喷好,從不同角度進行觀察翔横。但是這個金字塔木有底面,所以我們可以看到它的內(nèi)部梗搅。

opengl05.png

代碼如下

    //通過三角形創(chuàng)建金字塔
    GLfloat vPyramid[12][3] = {
        -2.0f, 0.0f, -2.0f,
        2.0f, 0.0f, -2.0f,
        0.0f, 4.0f, 0.0f,
        
        2.0f, 0.0f, -2.0f,
        2.0f, 0.0f, 2.0f,
        0.0f, 4.0f, 0.0f,
        
        2.0f, 0.0f, 2.0f,
        -2.0f, 0.0f, 2.0f,
        0.0f, 4.0f, 0.0f,
        
        -2.0f, 0.0f, 2.0f,
        -2.0f, 0.0f, -2.0f,
        0.0f, 4.0f, 0.0f};
    
    //GL_TRIANGLES 每3個頂點定義一個新的三角形
    triangleBatch.Begin(GL_TRIANGLES, 12);
    triangleBatch.CopyVertexData3f(vPyramid);
    triangleBatch.End();

(2)環(huán)繞

將順時針方向繪制的三角形用逆時針的方式繪制禾唁。
如下圖,在繪制第一個三角形時无切,線條是按照從V0-V1荡短,再到V2。最后再回到V0的一個閉合三角形哆键。 這個是沿著頂點順時針方向掘托。
這種順序與方向結(jié)合來指定頂點的方式稱為 環(huán)繞
下圖的2個三角形的環(huán)繞方向完全相反洼哎。

opengl06.png

正面與背面:

在默認的情況下烫映,OpenGL認為具有逆時針方向環(huán)繞的多邊形是 正面的。而右側(cè)的順時針方向三角形是三角形的 背面噩峦。

為什么區(qū)分正背面很重要锭沟?
因為我們常常希望為一個多邊形的正面和背面分別設(shè)置不同的物理特征。我們可以完全隱藏一個多邊形的背面识补,或者給它設(shè)置一種不同的顏色和反射屬性族淮。紋理圖像在背面三角形中也是相反的。在一個場景中,使所有的多邊形保持環(huán)繞方向的一致祝辣,并使用正面多邊形來繪制所有實心物體的表面是非常重要的贴妻。

如果想改變OpenGL這個默認行為,可以調(diào)用下面的函數(shù):

glFrontFace(GL_CW);
參數(shù):GL_CW | GL_CCW
GL_CCW:表示傳入的mode會選擇逆時針為前向
GL_CW:表示順時針為前向蝙斜。
默認:GL_CCW名惩。逆向時針為前向。

(3) 三角地帶

對于很多表面和形狀來說孕荠,我們可能需要繪制幾個相連的三角形娩鹉。我們可以使用GL_TRIANGLE_STRIP圖元繪制一串相連的三角形。從而節(jié)省大量的時間稚伍。

opengl07.png

使用三角帶而不是分別指定每個三角形弯予,這樣做有兩個優(yōu)點:

  1. 用前3個頂點指定第1個三角形之后,對于接下來的每一個三角形个曙,只需要再指定1個頂點锈嫩。需要繪制大量的三角形時,采用這種方法可以節(jié)省大量的程序代碼和數(shù)據(jù)存儲空間垦搬。
    2.提供運算性能和節(jié)省帶寬呼寸。更少的頂點意味著數(shù)據(jù)從內(nèi)存?zhèn)鬏數(shù)綀D形卡的速度更快,并且頂點著色器需要處理的次數(shù)也更少了悼沿。

(4) 三角形扇

除了三角形帶之外等舔,還可以使用GL_TRIANGLE_FAN創(chuàng)建一組圍繞一個中心點的相連三角形。通過4個頂點所產(chǎn)生的包括3個三角形的三角形扇糟趾。 第一個頂點 V0 構(gòu)建了扇形的原點,用前3個頂點指定了最初的三角形之后甚牲,后續(xù)的每個頂點都和原點(V0)以及之前緊挨著它的那個頂點(Vn-1)形成接下來的三角形义郑。

opengl08.png

3、一個簡單批次容器

GLTools 庫中包含額一個簡單的容器類丈钙,叫做 GLBatch非驮。這個類可以作為7種圖元的簡單批次容器使用。而且它知道在使用GL_ShaderManager支持的任意存儲著色器時如何對圖元進行渲染雏赦。
使用 GLBatch 類非常簡單劫笙。首先對批次進行初始化,告訴這個類它代表哪種圖元星岗,其中包括的頂點數(shù)填大,以及(可選)一組或兩組紋理坐標。

參數(shù)1:圖元
參數(shù)2:頂點數(shù)
參數(shù)3:一組或者2組紋理坐標(可選)
void GLBatch::Begain(GLeunm primitive,GLuint nVerts,GLuint nTexttureUnints = 0);

然后俏橘,至少要復制一個由3分量(x, y, z)頂點組成的數(shù)組允华。

//復制表面法線
void GLBatch::CopyVertexData3f(GLfloat *vVerts);

還可以選擇復制表面發(fā)現(xiàn)、顏色和紋理坐標。

//復制表面法線
void GLBatch::CopyNormalDataf(GLfloat *vNorms);
//復制顏色
void GLBatch::CopyColorData4f(GLfloat *vColors);
//復制紋理坐標
void GLBatch::CopyTexCoordData2f(GLFloat *vTextCoords,GLuint uiTextureLayer);

完成上述工作以后靴寂,可調(diào)用End來表明已經(jīng)完成了數(shù)據(jù)復制工作磷蜀,并且將設(shè)置內(nèi)部標記,以通知這個類包含哪些屬性百炬。

//結(jié)束繪制
void GLBatch::End(void);

實際上褐隆,可以在任何我們想要的時候進行復制,只要不改變累的大小即可剖踊。
而一旦調(diào)用End函數(shù)妓灌,就不能再增加新的屬性了(也就是說我們現(xiàn)在也不能確定是否要有表面法線了)。

關(guān)于提交屬性的 OpengGL 實際內(nèi)部運行機制實際上比這要復雜的多蜜宪。GLBatch 類只是一個便利類(convenience class),就像使用GLUT一樣方便虫埂。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市圃验,隨后出現(xiàn)的幾起案子掉伏,更是在濱河造成了極大的恐慌,老刑警劉巖澳窑,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斧散,死亡現(xiàn)場離奇詭異,居然都是意外死亡摊聋,警方通過查閱死者的電腦和手機鸡捐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來麻裁,“玉大人箍镜,你說我怎么就攤上這事〖逶矗” “怎么了色迂?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長手销。 經(jīng)常有香客問我歇僧,道長,這世上最難降的妖魔是什么锋拖? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任诈悍,我火速辦了婚禮,結(jié)果婚禮上兽埃,老公的妹妹穿的比我還像新娘侥钳。我一直安慰自己,他們只是感情好讲仰,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布慕趴。 她就那樣靜靜地躺著痪蝇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪冕房。 梳的紋絲不亂的頭發(fā)上躏啰,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機與錄音耙册,去河邊找鬼给僵。 笑死,一個胖子當著我的面吹牛详拙,可吹牛的內(nèi)容都是我干的帝际。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼饶辙,長吁一口氣:“原來是場噩夢啊……” “哼蹲诀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起弃揽,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤脯爪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后矿微,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痕慢,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年涌矢,在試婚紗的時候發(fā)現(xiàn)自己被綠了掖举。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡娜庇,死狀恐怖塔次,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情思灌,我是刑警寧澤俺叭,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站泰偿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蜈垮。R本人自食惡果不足惜耗跛,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望攒发。 院中可真熱鬧调塌,春花似錦、人聲如沸惠猿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至姜凄,卻和暖如春政溃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背态秧。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工董虱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人申鱼。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓愤诱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捐友。 傳聞我的和親對象是個殘疾皇子淫半,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

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

  • 一、著色器 從之前的文章匣砖,我們應(yīng)該知道大概OpenGL的一個渲染流程流程: 接下來我們再查看一下OpenGL渲染架...
    coder_feng閱讀 339評論 0 0
  • 學習目標: 1.OpenGL渲染架構(gòu)(掌握) OpenGL數(shù)據(jù)傳遞的3種方式(理解) OpenGL提供的著色器(掌...
    小破孩丫閱讀 547評論 0 1
  • OpenGl渲染架構(gòu) Client:這里的客戶端指的是我們在應(yīng)用程序中編寫的C/C++代碼科吭,以及OpenGL的相關(guān)...
    Maji1閱讀 269評論 0 1
  • 由于OpenGL是基于C的API,因此它非常便攜且受到?泛支持脆粥。作為C API砌溺,它與基于Objective-C的C...
    呂建雄閱讀 400評論 0 0
  • 目標: 掌握OpenGL渲染架構(gòu)圖 理解OpenGL數(shù)據(jù)傳遞的三種方式 掌握OpenGL提供的存儲著色器 正投影 ...
    SPIREJ閱讀 474評論 0 0