0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在計(jì)算機(jī)圖形學(xué)中GPGPU需要用到的OpenGL概念

電子工程師 ? 來(lái)源:koibiki博客 ? 作者:koibiki博客 ? 2022-10-18 15:04 ? 次閱讀

在計(jì)算機(jī)圖形學(xué)中,紋理映射是實(shí)現(xiàn)復(fù)雜表面效果的高效方法,即以較小的計(jì)算量就可以實(shí)現(xiàn)較為逼真的模芯效果。在GPGPU中,紋理映射也是一個(gè)至關(guān)重要的概念。由圖形API實(shí)現(xiàn)經(jīng)典GPGPU的原理可以總結(jié)為:用紋理映射實(shí)現(xiàn)的科學(xué)計(jì)算(computation by texturing)。

1、紋理映射的概念

在渲染對(duì)象過(guò)程中,最簡(jiǎn)單的方式是給各個(gè)對(duì)象表面顯式地涂上各種顏色。但這樣顏色會(huì)非常單一。同時(shí),讓設(shè)計(jì)者手動(dòng)地給每個(gè)像素定義不同顏色顯然也不可能。于是,紋理映射就成為一個(gè)生成較高質(zhì)量三維表面地高效地這種方案。

紋理映射的原理:首先,由應(yīng)用程序生成頂點(diǎn)組成的三維模型。然后這些頂點(diǎn)被網(wǎng)格化或三角化,變成若干相連的平面。這是,可以選擇使用一些預(yù)定好的二維位圖,在定義好模型后,將這些位圖貼在對(duì)象表面。這個(gè)過(guò)程稱為紋理映射。映射,也就指的是通過(guò)空間中的頂點(diǎn)坐標(biāo)與紋理坐標(biāo)之間的函數(shù)關(guān)系,用紋理圖為頂點(diǎn)賦值。

2、幾何圖元

幾何圖元是組成人們熟知地三維模型地基本元素,如點(diǎn)、直線、三角形等,通常由一個(gè)頂點(diǎn)列表組成。為了標(biāo)志頂點(diǎn)列表地起始和終止位置,需要使用函數(shù)glBegin()和glEnd()。glBegin()地形參是一個(gè)幾何圖元對(duì)象地名稱。

glBegin(GL_POLYGON); //GL_POLYGON 是多邊形圖元地標(biāo)識(shí)。這里表示一個(gè)邊長(zhǎng)為2的二維正方形 glVertex2f(-1.-, -1.0); glVertex2f(-1.0, 1.0); glVertex2f(1.0, 1.0); glVertext2f(1.0, -1.0); glEnd();

常用OpenGL幾何圖元類型

幾何圖元類型 注釋
GL_POINTS 單個(gè)頂點(diǎn)集
GL_LINES 多組雙頂點(diǎn)線段
GL_POLYGON 單個(gè)簡(jiǎn)單填充凸多邊形
GL_TRIANGLES 多組獨(dú)立填充三角形
GL_QUADS 多組獨(dú)立填充四邊形
GL_LINE_STRIP 不閉合折線
GL_LINE_LOOP 閉合折線
GL_TRIANGLE_STRIP 線性連續(xù)填充三角形串
GL_TRIANGLE_FAN 扇形連續(xù)填充三角形串
GL_QUAD_STRIP 連續(xù)填充四邊形串

同時(shí)如果我們給同一個(gè)圖元不同頂點(diǎn)指定了不同顏色,OpenGL默認(rèn)對(duì)策是對(duì)圖元進(jìn)行平滑著色,即根據(jù)頂點(diǎn)顏色對(duì)其他部分線性插值。紋理坐標(biāo)也是每個(gè)頂點(diǎn)的屬性,可以使用函數(shù)glTexCoor()指定。

幾何圖元可以分為填充圖元和非填充圖元兩類。直線是非填充圖元,其不具備“內(nèi)部”。二維多邊形是一種填充圖元,其“內(nèi)部”可以定義。OpenGL中,填充圖元有三種方式,即頂點(diǎn)方式、邊線方式和填充方式。頂點(diǎn)方式是用頂點(diǎn)組成的點(diǎn)集來(lái)繪制;邊線方式是僅繪制多邊形的邊線,其“內(nèi)部”沒(méi)有定義。填充方式是對(duì)多邊形進(jìn)行填充,此時(shí)邊線在填充時(shí)也是內(nèi)部的一部分。

3、位圖與流水線

位圖是另一種基本圖元,也稱為離散圖元。它是一個(gè)由向量組成的矩陣。向量的元素?cái)?shù)就是位圖的通道數(shù),比如彩色位圖通常是RGB,或者加入透明通道為RGBA。

與幾何圖元一樣,位圖也是圖形應(yīng)用程序可以生成的數(shù)據(jù)形式。同樣會(huì)進(jìn)入圖像流水線。但是,位圖已經(jīng)是可以存儲(chǔ)在幀緩存里的二維離散圖元,它不用流經(jīng)頂點(diǎn)處理單元,而是從另一條并行的流水線流入,在片段處理階段和流過(guò)頂點(diǎn)處理單元的數(shù)據(jù)匯合。

OpenGL對(duì)像素的讀寫,具體有三種操作:

把像素塊從幀緩存讀到住存儲(chǔ)器中,對(duì)應(yīng)OpenGL函數(shù)是glReadPixels()

把像素塊從主存儲(chǔ)器寫入光柵化器中,對(duì)應(yīng)OpenGL函數(shù)是glDrawPixels()

把像素塊從幀緩存復(fù)制到光柵化器中,對(duì)應(yīng)OpenGL函數(shù)是glCopyPixels()

基本流程如圖:

注意,像素塊在OpenGL中的存儲(chǔ)方式可能和在主存儲(chǔ)器中的不同,如像素中各分量的排列順序。如果想要將像素塊從幀緩存的一部分轉(zhuǎn)移到另一部分,就需要先讀出像素,然后在另一處寫入??梢允褂胓lReadPixels和glDrawPixels,但頻繁在主機(jī)與設(shè)備間傳輸數(shù)據(jù)過(guò)于低效,推薦使用glCopyPixels。

4、紋理圖

可以將紋理圖看成一張顏色查找表,根據(jù)每個(gè)頂點(diǎn)的紋理坐標(biāo)可以從紋理圖上查到該頂點(diǎn)的顏色。通常紋理圖和幀緩存中的位圖一樣,都是由離散的像素構(gòu)成。為了區(qū)分,我們將紋理圖上的一個(gè)像素稱為紋理元。事實(shí)上,由于紋理坐標(biāo)都是經(jīng)過(guò)插值和采樣計(jì)算得到的,所以在紋理圖中查找顏色并不是連三的。而是根據(jù)相鄰紋理元的顏色插值或最近鄰得到的。因此可以將紋理圖看成連續(xù)的數(shù)組,它的二維坐標(biāo)都是在實(shí)數(shù)域內(nèi)得到定義的。

OpenGL中默認(rèn)的紋理圖都是邊長(zhǎng)為1的正方形。這樣避免了使用明確坐標(biāo),用戶就可以在不必知道紋理圖尺寸的情況下使用紋理。但對(duì)GPGPU編程卻產(chǎn)生了不便。如,需要知道一個(gè)長(zhǎng)度為512的數(shù)組的第100個(gè)元素,用C語(yǔ)言查找只需要使用下標(biāo)99即可,但OpenGL需要使用100.0/512.0=0.1953125.

OpenGL中設(shè)置紋理圖的函數(shù)為glTexImage2D(),一個(gè)指定4個(gè)分量、每個(gè)分量為1個(gè)字節(jié)的二維紋理圖:

#define nImageWidth 64 #define nImageHeight 64 static Glubyte ubImage[nImageHeight][nImageWidth][4]; //填充數(shù)組 glEnable(GL_TEXTURE_2D); glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,nImageWidth,nImageHeigght,0,GL_RGBA,GL_UNSIGNED_BYTE, ubImage);

當(dāng)不需要對(duì)整幅紋理圖進(jìn)行操作時(shí),可以使用函數(shù)glTexSubImage2D()來(lái)定義一幅子紋理圖。

當(dāng)使用glTexImage2D時(shí),OpenGL就會(huì)在顯卡上分配一塊紋理緩存,把紋理圖從內(nèi)存轉(zhuǎn)移到紋理緩存中。如果已經(jīng)調(diào)用過(guò)glTexImage2D,更新紋理圖最好使用glTexSubImage2D,這樣就不用在顯卡上重新分配存儲(chǔ)空間,如果改動(dòng)較小也不用將整個(gè)紋理圖傳輸?shù)斤@卡上,以提高效率。這也是GPGPU的典型做法。

5、紋理坐標(biāo)

將紋理圖映射到三維表面是通過(guò)為每個(gè)頂點(diǎn)定義紋理坐標(biāo)實(shí)現(xiàn)的。與頂點(diǎn)坐標(biāo)一樣,是一個(gè)四維向量[s,t,r,q].除第一個(gè)分量外(使用時(shí),用戶至少需要使用一維紋理坐標(biāo),因而s一定由用戶設(shè)定),其他分量的默認(rèn)值為:t=0,r=0,q=1。設(shè)置紋理坐標(biāo)函數(shù)為glTexCoord()。

6、紋理參數(shù)

在紋理映射前,還需要對(duì)一些參數(shù)進(jìn)行設(shè)置。

1. 越界取值:當(dāng)指定的紋理坐標(biāo)值大于實(shí)際的取值范圍時(shí),即超出紋理圖的邊界時(shí),GL_TEXTURE_WRAP系列參數(shù)用來(lái)指定這種情況下,OpenGL采取的措施??偟膩?lái)說(shuō),OpenGL一般有兩種策略。一種是用鉗位算法(clamp)將坐標(biāo)值限制在某個(gè)區(qū)間內(nèi),即大于該范圍的取值就鉗定在區(qū)間上限,小于時(shí)就鉗定在區(qū)間下限。另一種時(shí)在邊界以外重復(fù)邊界內(nèi)的取值。

2. 放大/縮小紋理圖

7、映射參數(shù)

此外,還需要確定映射過(guò)程中紋理圖與表面的相互作用,即處理與表面已有顏色的相互關(guān)系。通過(guò)glTexEnv進(jìn)行。

8、紋理對(duì)象

如果用戶同時(shí)使用多塊紋理,則頻繁使用glTexImage來(lái)加載過(guò)于低效。OpenGL提供了紋理對(duì)象來(lái)管理紋理,這樣多塊紋理可以在紋理緩存中并存。紋理緩存不足時(shí),OpenGL會(huì)按照優(yōu)先級(jí)管理紋理,使加載紋理次數(shù)盡可能少。

首先,需要調(diào)用glGenTextures()來(lái)建立一個(gè)紋理對(duì)象。其會(huì)返回n個(gè)有效的整數(shù)紋理標(biāo)識(shí)符。這些整數(shù)被保存在textureNames數(shù)組中。這些返回的紋理表示符都是目前OpenGL未被占用的,不一定是連續(xù)的整數(shù)。0是OpenGL預(yù)留的紋理標(biāo)識(shí)符,不會(huì)被分配。分配到的紋理對(duì)象的標(biāo)識(shí)符,只表示該標(biāo)識(shí)符有效,而紋理暫時(shí)還是無(wú)效的。使用前,用戶需要將它與某種類型的紋理綁定起來(lái)glBindTexture()。同時(shí)相關(guān)程序結(jié)束后,可以使用glDeleteTextures()刪除。

9、紋理單元

紋理單元與多重紋理映射息息相關(guān)。在圖形任務(wù)中,有時(shí)需要將多塊紋理映射到同一表面,映射的結(jié)果是多重紋理融合的效果。OpenGl使用紋理單元來(lái)管理多重紋理映射中使用的不同紋理圖。一個(gè)紋理單元就是一個(gè)獨(dú)立的紋理,除了紋理圖本身外,它還保存了紋理坐標(biāo)和紋理參數(shù)等一切使用該紋理需要的信息。同一紋理圖也可以被多個(gè)紋理單元使用。

多重紋理映射時(shí),可以使用OpenGL常量GL_TEXTUREi來(lái)選擇使用哪個(gè)紋理單元,其中i是0到31的整數(shù)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1506

    瀏覽量

    62208
  • OpenGL
    +關(guān)注

    關(guān)注

    1

    文章

    85

    瀏覽量

    29273
  • 計(jì)算機(jī)圖形學(xué)

    關(guān)注

    0

    文章

    12

    瀏覽量

    8144
  • 紋理映射
    +關(guān)注

    關(guān)注

    0

    文章

    4

    瀏覽量

    1789
  • GPGPU
    +關(guān)注

    關(guān)注

    0

    文章

    29

    瀏覽量

    4905
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    計(jì)算機(jī)圖形學(xué)年鑒:研究現(xiàn)狀、應(yīng)用和未來(lái)

    計(jì)算機(jī)圖形學(xué)是支持各種影視特效、三維動(dòng)畫影片、計(jì)算機(jī)游戲、虛擬現(xiàn)實(shí)以及大家手機(jī)上各種照片視頻美化特效背后的技術(shù)基礎(chǔ),本文中,微軟亞洲研究院網(wǎng)絡(luò)圖形
    發(fā)表于 01-03 10:44 ?1199次閱讀

    計(jì)算機(jī)圖形學(xué)研究和應(yīng)用

    計(jì)算機(jī)圖形學(xué)研究和應(yīng)用論文關(guān)于計(jì)算機(jī)圖形學(xué)的發(fā)展及應(yīng)用探究  【摘要】計(jì)算機(jī)圖形學(xué)經(jīng)過(guò)三十多年的
    發(fā)表于 08-31 08:05

    計(jì)算機(jī)圖形學(xué)定義

    計(jì)算機(jī)圖形學(xué)定義:計(jì)算機(jī)圖形學(xué)是研究怎樣用數(shù)字計(jì)算機(jī)生成、處理和顯示圖形的一門學(xué)科。
    發(fā)表于 08-31 07:07

    計(jì)算機(jī)圖形學(xué)原理教程(Visual+C++版)

    計(jì)算機(jī)圖形學(xué)原理教程(Visual+C++版)
    發(fā)表于 07-15 16:11 ?0次下載

    什么是計(jì)算機(jī)圖形學(xué)

    什么是計(jì)算機(jī)圖形學(xué) 計(jì)算機(jī)圖形學(xué)(Computer Graphics,簡(jiǎn)稱CG),是研究用計(jì)算機(jī)來(lái)處理
    發(fā)表于 05-24 23:26 ?2719次閱讀

    基于OpenGL計(jì)算機(jī)圖形學(xué)教學(xué)改革探索

    針對(duì)傳統(tǒng)的本科計(jì)算機(jī)圖形學(xué)教學(xué)存在的問(wèn)題,提出了基于OpenGL實(shí)驗(yàn)平臺(tái)的教學(xué)改革方法,設(shè)計(jì)了基于OpenGL
    發(fā)表于 07-27 16:08 ?21次下載

    計(jì)算機(jī)圖形學(xué)講義

    計(jì)算機(jī)圖形學(xué)是利用計(jì)算機(jī)研究圖形的表示、生成、處理、顯示的學(xué)科。
    發(fā)表于 03-22 16:33 ?0次下載

    MFC編程基礎(chǔ)-圖形學(xué)

    計(jì)算機(jī)上的上位機(jī)制作工具語(yǔ)言之MFC編程基礎(chǔ)-圖形學(xué)
    發(fā)表于 09-01 15:01 ?0次下載

    計(jì)算機(jī)圖形學(xué)的非線性投影研究

    隨著科學(xué)技術(shù)的不斷發(fā)展,非線性的投影方法由以前的小范圍使用,發(fā)展到了包括計(jì)算的機(jī)圖形學(xué)、圖像處理、地圖設(shè)計(jì)、攝影,畫畫等領(lǐng)域中。為了使各需要投影技術(shù)的領(lǐng)域提供更好的技術(shù)支持,文中提出
    發(fā)表于 11-11 12:08 ?9次下載
    <b class='flag-5'>計(jì)算機(jī)</b><b class='flag-5'>圖形學(xué)</b>的非線性投影研究

    清華AMiner團(tuán)隊(duì)發(fā)布計(jì)算機(jī)圖形學(xué)研究報(bào)告

    清華AMiner團(tuán)隊(duì)近日發(fā)布新一期研究報(bào)告——《計(jì)算機(jī)圖形學(xué)研究報(bào)告》,報(bào)告全文共 53 頁(yè),從概念、技術(shù)、人才、會(huì)議、應(yīng)用及相應(yīng)趨勢(shì)詳細(xì)介紹了計(jì)算機(jī)
    的頭像 發(fā)表于 08-20 15:31 ?3171次閱讀
    清華AMiner團(tuán)隊(duì)發(fā)布<b class='flag-5'>計(jì)算機(jī)</b><b class='flag-5'>圖形學(xué)</b>研究報(bào)告

    計(jì)算機(jī)圖形學(xué)總覽:圖像和圖像的概念辨析

    計(jì)算機(jī)圖形學(xué)計(jì)算機(jī)視覺是同一過(guò)程的兩個(gè)方向。計(jì)算機(jī)圖形學(xué)將抽象的語(yǔ)義信息轉(zhuǎn)化成圖形
    的頭像 發(fā)表于 08-21 09:10 ?6604次閱讀

    2018計(jì)算機(jī)圖形學(xué)AMiner的研究報(bào)告詳細(xì)資料免費(fèi)下載

    計(jì)算機(jī)圖形學(xué)計(jì)算機(jī)科學(xué)領(lǐng)域的重要研究方向之一,圖形學(xué)技術(shù)也社會(huì)生活和生產(chǎn)的各個(gè)領(lǐng)域得到應(yīng)用。本研究報(bào)告對(duì)
    發(fā)表于 12-25 08:00 ?0次下載
    2018<b class='flag-5'>計(jì)算機(jī)</b><b class='flag-5'>圖形學(xué)</b>AMiner的研究報(bào)告詳細(xì)資料免費(fèi)下載

    計(jì)算機(jī)圖形學(xué) 數(shù)字圖像處理和計(jì)算機(jī)視覺是什么?

    計(jì)算機(jī)圖形學(xué)(Computer Graphics)講的是圖形,也就是圖形的構(gòu)造方式,是一種從無(wú)到有的概念,從數(shù)據(jù)得到圖像。是給定關(guān)于景象結(jié)構(gòu)
    的頭像 發(fā)表于 04-04 17:34 ?4891次閱讀
    <b class='flag-5'>計(jì)算機(jī)</b><b class='flag-5'>圖形學(xué)</b> 數(shù)字圖像處理和<b class='flag-5'>計(jì)算機(jī)</b>視覺是什么?

    計(jì)算機(jī)圖形學(xué)到人工智能

    GPU的硬件設(shè)計(jì)上引入了圖形管線,使得各任務(wù)可以通過(guò)流水線進(jìn)行并行處理。同時(shí)通過(guò)可編程的著色器,使得GPU硬件能夠根據(jù)圖形學(xué)算法更好的被使用。
    的頭像 發(fā)表于 03-02 16:17 ?1159次閱讀
    從<b class='flag-5'>計(jì)算機(jī)</b><b class='flag-5'>圖形學(xué)</b>到人工智能

    計(jì)算機(jī)圖形學(xué):探索虛擬世界的構(gòu)建之道

    的應(yīng)用無(wú)處不在,從電影特效到建筑設(shè)計(jì),從游戲開發(fā)到虛擬現(xiàn)實(shí),它都在不斷地推動(dòng)著視覺藝術(shù)和技術(shù)的邊界。一、基礎(chǔ)概念在深入了解計(jì)算機(jī)圖形學(xué)之前,我們需要了解一些基礎(chǔ)
    的頭像 發(fā)表于 05-07 08:27 ?437次閱讀
    <b class='flag-5'>計(jì)算機(jī)</b><b class='flag-5'>圖形學(xué)</b>:探索虛擬世界的構(gòu)建之道