最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

封裝Renderer,紋理

2023-08-25 13:53 作者:西村啪啪二  | 我要投稿


今天開始寫Renderer類,在這個(gè)類中,我們會(huì)寫一個(gè)Draw方法,它會(huì)接收實(shí)際要繪制的數(shù)據(jù)。我們需要考慮這個(gè)類應(yīng)該是static或者是一個(gè)單例之類的,這取決于我們?nèi)绾稳ナ褂盟@里我們不用static也不用單例模式,把它當(dāng)作一個(gè)普通的類來處理。

首先添加一個(gè)Draw函數(shù),參數(shù)需要頂點(diǎn)數(shù)組、索引緩沖區(qū)和著色器,這里頂點(diǎn)數(shù)組已經(jīng)綁定了頂點(diǎn)緩沖區(qū),所以不需要頂點(diǎn)緩沖區(qū)。還添加了一個(gè)Clear函數(shù),將glClear封裝進(jìn)來。

VertexBufferLayout.h中包含了Renderer.h,Renderer.h中包含了VertexArray.h,而VertexArray.h中又包含了VertexBufferLayout.h,這相當(dāng)于Renderer.h和VertexBufferLayout.h互相包含了,像是進(jìn)入了一個(gè)無限循環(huán)的包含。

我們只需要在VertexArray.h將VertexBufferLayout.h的包含刪除,直接聲明這個(gè)類,然后在cpp文件中包含這個(gè)類的頭文件

材質(zhì)基本上就是一個(gè)著色器加上一系列數(shù)據(jù),包括所有的統(tǒng)一變量,不管是特殊的統(tǒng)一變量還是每個(gè)對(duì)象都有的統(tǒng)一變量,?當(dāng)我們把材質(zhì)傳遞給渲染器時(shí),渲染器就會(huì)綁定材質(zhì),意味著它會(huì)綁定著色器,設(shè)置它所需的所有統(tǒng)一變量,然后根據(jù)索引繪制。目前我們想修改一個(gè)著色器的統(tǒng)一變量,只能自己手動(dòng)完成,這有點(diǎn)煩人,我們之后會(huì)接觸到材質(zhì)。無論如何,Renderer類的方法相當(dāng)多,我們現(xiàn)在有一個(gè)類了,隨著我們實(shí)際需要渲染的東西越來越多,可以持續(xù)往里面添加?xùn)|西。

紋理,簡(jiǎn)單來說我們可以把它看作是我們?cè)阡秩緯r(shí)可以使用的一個(gè)圖像,我們可以在電腦中創(chuàng)建任何圖像文件,然后把它上傳到我們的顯存中,然后在我們的著色器中使用它來繪制我們正在做的任何東西,這可能就像我們?cè)贠penGL程序中畫一個(gè)矩形一樣簡(jiǎn)單,但也可能是更復(fù)雜的東西,就比如使用預(yù)先計(jì)算好的數(shù)學(xué)值,將其融入到我們的紋理中,然后在著色器中對(duì)它們進(jìn)行采樣,這樣我們可以做一些很酷的效果,但現(xiàn)在,我們只在OpenGL中獲取到計(jì)算機(jī)上圖像然后繪制出來。

我們先把電腦上的圖像文件上傳過來,讓它可以在著色器中進(jìn)行采樣,然后把它繪制在屏幕上。第一步,我們需要將圖像加載到CPU內(nèi)存中,我們要使用stb_image庫來來加載圖像文件,我們會(huì)給它一個(gè)文件路徑,他會(huì)給我們一個(gè)指向RGBA像素緩沖區(qū)的指針,我們會(huì)拿到這個(gè)像素?cái)?shù)組,把這些數(shù)據(jù)作為紋理發(fā)送到GPU,著色器讀取這個(gè)紋理,在繪制時(shí),片段著色器就會(huì)從紋理內(nèi)存中讀取并計(jì)算出每個(gè)像素應(yīng)該是什么,構(gòu)成那個(gè)紋理每部分的顏色是什么。

我們下載stb_image頭文件,將它加入我們的工程,并另創(chuàng)建一個(gè)新的C++文件,輸入以下代碼并編譯就可以了

OpenGL中有很多插槽(slot)可以綁定紋理,在Windows上,一般顯卡會(huì)有32個(gè)紋理插槽,而移動(dòng)設(shè)備上一般是8個(gè),這取決于顯卡以及它們的OpenGL實(shí)現(xiàn)。

創(chuàng)建Texture類

首先用stbi_set_flip_vertically_on_load垂直翻轉(zhuǎn)我們的紋理,因?yàn)镺penGL掃描我們的紋理像素是從左下角開始的,而通常當(dāng)我們加載圖像時(shí),存儲(chǔ)是從圖像的頂部到底部的,所以實(shí)際上我們需要在加載時(shí)翻轉(zhuǎn)它,不過這取決于我們的紋理格式,這里是PNG或者JPG ,那么我們需要翻轉(zhuǎn)它。

我們就有了在這個(gè)LocalBuffer中所有的紋理,然后就可以設(shè)置紋理參數(shù),

GL_TEXTURE_MIN_FILTER是縮小過濾器,如果我們?cè)谝粋€(gè)比實(shí)際的紋理更小的區(qū)域上渲染紋理,那么需要將紋理縮小

GL_TEXTURE_MAG_FILTER是放大過濾器,如果我們?cè)谝粋€(gè)比實(shí)際的紋理更大的區(qū)域上渲染紋理,那么需要將紋理放大

GL_TEXTURE_WRAP_S是嵌入模式(環(huán)繞模式),S指水平環(huán)繞,

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_Width, m_Heigh, m_LocalBuffer)這里GL_RGBA是我們希望OpenGL處理數(shù)據(jù)的方式,內(nèi)部格式與格式是不一樣的,內(nèi)部格式是OpenGL存儲(chǔ)紋理數(shù)據(jù)的方式,而格式是紋理數(shù)據(jù),是我們提供給OpenGL的數(shù)據(jù)格式,這里就是m_LocalBuffer的格式。最后一個(gè)參數(shù)指定像素,如果我們還沒準(zhǔn)備好數(shù)據(jù)就可以在這里傳遞一個(gè)空指針或者0。

這樣就加載好了紋理,接下來要告訴Shader如何采樣紋理,?所以我們要更新頂點(diǎn)數(shù)據(jù),將紋理坐標(biāo)添加進(jìn)去,并且在綁定頂點(diǎn)緩沖區(qū)時(shí)將參數(shù)做相應(yīng)的調(diào)整

接著我們需要在頂點(diǎn)著色器中添加紋理及其坐標(biāo),使其能夠接受頂點(diǎn)坐標(biāo)為一個(gè)頂點(diǎn)屬性,并把紋理坐標(biāo)傳給片段著色器,片段著色器可以通過sampler(采樣器)來訪問紋理對(duì)象,sampler以紋理類型作為后綴,這里因?yàn)槭?D的圖片,所以我們聲明一個(gè)uniform sampler2D,通過GLSL內(nèi)建的texture函數(shù)來采樣紋理的顏色,第一個(gè)參數(shù)是紋理采樣器,第二個(gè)參數(shù)是對(duì)應(yīng)的紋理坐標(biāo)。texture函數(shù)會(huì)使用之前設(shè)置的紋理參數(shù)對(duì)相應(yīng)的顏色值進(jìn)行采樣。這個(gè)片段著色器的輸出就是紋理的(插值)紋理坐標(biāo)上的(過濾后的)顏色。

最后在調(diào)用glDrawElements之前綁定紋理,就完成了把紋理賦值給采樣器的工作,最后運(yùn)行就能將圖片輸出


封裝Renderer,紋理的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
东安县| 永德县| 师宗县| 梁平县| 陇南市| 巍山| 三河市| 孟津县| 北安市| 东海县| 汤原县| 遂宁市| 外汇| 怀集县| 吴忠市| 鄂伦春自治旗| 上虞市| 金湖县| 宣威市| 永顺县| 和硕县| 八宿县| 甘泉县| 杭锦后旗| 辽阳市| 芜湖市| 高唐县| 桐柏县| 新乐市| 韩城市| 读书| 开封县| 宜丰县| 建始县| 紫金县| 双流县| 枝江市| 睢宁县| 寿阳县| 巴林左旗| 响水县|