青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

eryar

PipeCAD - Plant Piping Design Software.
RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
posts - 603, comments - 590, trackbacks - 0, articles - 0

A Simple OpenGL Shader Example

Posted on 2015-06-27 21:38 eryar 閱讀(5102) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): 2.OpenCASCADE

A Simple OpenGL Shader Example

eryar@163.com

Abstract. OpenGL Shading Language, the high-level programming language defined to allow application writers to write programs that execute on the programmable processors defined within OpenGL. Informally the language is sometimes referred to as GLSL. The GLSL has been made part of the OpenGL standard as of OpenGL2.0. The paper focus on a simple example of OpenGL Shader, which can be used as a guide of GLSL.

Key Words. OpenGL, OpenGL Shading Language, GLSL, Shader, Qt


1. Introduction

很早之前,從網(wǎng)上下載到這么一本書(shū)《OpenGL Shading Language》,翻看了幾遍,終不得要領(lǐng)。后來(lái)看到一本由仇德元編寫(xiě)的《GPGPU編程技術(shù)—從GLSL、CUDA到OpenCL》,對(duì)GPU的了新的認(rèn)識(shí),對(duì)其性能刮目相看。書(shū)中給出的一個(gè)簡(jiǎn)單例子,也便于對(duì)Shader的入門(mén)。

wps_clip_image-22807 wps_clip_image-16315

Figure 1.1 OpenGL Shading Language and GPGPU

從OpenGL Shading Language的出現(xiàn)可以發(fā)現(xiàn)程序員的一個(gè)特點(diǎn),那就是不喜歡一成不變的東西,希望自己有更多的控制權(quán),有個(gè)性,向往自由。如果要有個(gè)性,那就要引入這個(gè)新的東西GLSL了,增加了學(xué)習(xí)成本。不過(guò)從OpenGL2.0之后,Shader已經(jīng)成了OpenGL標(biāo)準(zhǔn)的一部分,新版的OpenGL的書(shū)籍中都少不了shader的內(nèi)容。Shader成了真實(shí)感圖形、高性能計(jì)算中不可或缺的技術(shù),學(xué)習(xí)掌握新的工具是為了生活更輕松。

為了讓例子簡(jiǎn)單,本文在Qt中實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的Shader示例,通過(guò)這個(gè)例子入門(mén)后,再結(jié)合《OpenGL Shading Language》去實(shí)現(xiàn)更炫的效果。再者就是去理解OpenCASCADE中的shader應(yīng)用。

2.OpenGL operation pipeline

原來(lái)有個(gè)問(wèn)題一直困擾著我,那就是三維的模型怎么在二維的計(jì)算機(jī)屏幕上顯示的。現(xiàn)在明白了這個(gè)就其實(shí)是顯卡的主要工作,并按一定的流水線來(lái)實(shí)現(xiàn)的。圖形流水線(pipeline)是GPU工作的通用模型,它以某種形式表示的三維場(chǎng)景為輸入,輸出二維的光柵圖像(raster images),也就是位圖。這樣三維的模型就可以在二維的屏幕上進(jìn)行顯示了。下面依次解釋流水線中的關(guān)鍵步驟:

v 圖形流水線的起點(diǎn)是一個(gè)三維模型。這個(gè)三維模型可以是用軟件設(shè)計(jì)出的三維游戲人物,也可以是逆向工程(Reverse Engineering)中用激光掃描儀(Laser Scanner)設(shè)備采集的頂點(diǎn),也可以是幾何造型內(nèi)核(如OpenCASCADE)將模型網(wǎng)格化生成的頂點(diǎn)等。不論何種模型,在計(jì)算機(jī)處理之前都一定要經(jīng)過(guò)采樣而得到有限的離散頂點(diǎn),每個(gè)頂點(diǎn)都可以被一個(gè)向量描述為一個(gè)三維坐標(biāo)系里的點(diǎn)。這些可用來(lái)描述三維頂點(diǎn)組成了點(diǎn)云(Point Cloud)。如果采樣頻率足夠高,得到的頂點(diǎn)就可以細(xì)致地描述模型的表面。點(diǎn)云中的點(diǎn)可以由一個(gè)列表表示,列表中每一項(xiàng)是某點(diǎn)的三維坐標(biāo)值。同時(shí),列表中每一點(diǎn)都帶有該點(diǎn)的顏色信息。這個(gè)頂點(diǎn)列表即是流水線的輸入數(shù)據(jù),從起點(diǎn)進(jìn)入流水線。

v 頂點(diǎn)可以用來(lái)形成多邊形,從而擬合出近似的表面。由頂點(diǎn)形成多邊形最常用的一種方法是三角化(triangulation),即每相鄰的三個(gè)點(diǎn)組成一個(gè)三角形。接下來(lái)每個(gè)頂點(diǎn)要經(jīng)過(guò)一系列的逐頂點(diǎn)操作(per-vertex operation),比如計(jì)算每個(gè)頂點(diǎn)的光照、坐標(biāo)變換等。

v 由于顯示輸出的需要,用戶會(huì)定義一個(gè)視口(viewport),即觀察模型的位置和角度。然后,模型被投影到與視口觀察方向垂直的平面上。這個(gè)投影變換也是硬件加速的。根據(jù)視口的大小,投影結(jié)果有可能被裁剪(clipping)掉一部分。

v 接受模型投影的平面是一個(gè)幀緩存(frame buffer),它是一個(gè)由像素(pixels)定義的光柵化平面。光柵化(rasterization)的過(guò)程,實(shí)際上就是決定幀緩存上的哪些像素該取怎么樣的值。通過(guò)采樣和插值,光柵化器(rasterizer)會(huì)決定一幅最接近原投影圖像的位圖。

v 這些像素或者由像素連成的片段還須經(jīng)歷一些逐片段操作(per-fragment operation),也就是說(shuō)它們的顏色也可以根據(jù)算法改變。另外紋理映射(texturing or texture mapping)在這一階段也會(huì)覆蓋某些像素的值。對(duì)于投影和光柵化的結(jié)果,還要判斷片段的可見(jiàn)性,也就是遮擋探測(cè)(occlusion detection)。

v 最后幀緩存里面的結(jié)果被刷新到顯示器上。該過(guò)程以較高的頻率重復(fù),因?yàn)槿说囊曨l延遲,感覺(jué)到的就是連續(xù)的。

wps_clip_image-15682

Figure 2.1 A simplified version of the OpenGL pipeline

wps_clip_image-24778

Figure 2.2 Overview of OpenGL operation

可以將上述OpenGL的渲染管線想成有兩個(gè)機(jī)器來(lái)完成主要的工作:一個(gè)機(jī)器處理頂點(diǎn);一個(gè)處理片段。對(duì)于早期的OpenGL而言,只是兩個(gè)機(jī)器是內(nèi)置的,程序員不能改變他們的工作方式。

wps_clip_image-20622

Figure 2.3 The OpenGL Fixed-Function Pipeline[3]

然而可編程的Shader(programmable shader)則是可以對(duì)這兩個(gè)機(jī)器的工作進(jìn)行干預(yù)。

3.Using GLSL Shaders

當(dāng)你想在程序中使用一個(gè)頂點(diǎn)Shader或片段Shader時(shí),需要按如下步驟進(jìn)行:

v 創(chuàng)建一個(gè)Shader對(duì)象;

v 將Shader的源文件編譯到這個(gè)對(duì)象;

v 驗(yàn)證源文件是否編譯成功;

然后將這些shader鏈接到一個(gè)Shader程序:

v 創(chuàng)建一個(gè)Shader程序;

v 將創(chuàng)建的Shader對(duì)象綁定到這個(gè)Shader程序;

v 鏈接Shader程序;

v 驗(yàn)證鏈接是否成功;

v 將shader對(duì)象應(yīng)用到頂點(diǎn)及片段的處理;

如下圖所示:

wps_clip_image-9757

Figure 3.1 Shader Creation Flowchart

4.The simplest Shader Example

本來(lái)想用glut來(lái)寫(xiě)個(gè)簡(jiǎn)單的例子的,但是識(shí)別不了glCreateShader這種函數(shù),發(fā)現(xiàn)要下載一些第三方庫(kù)才可以,如glew。看到Qt中已經(jīng)有封裝好的QGLShader和QGLShaderProgram,所以還是決定用Qt來(lái)寫(xiě)個(gè)簡(jiǎn)單的例子,從而來(lái)對(duì)OpenGL的shader有個(gè)感性的認(rèn)識(shí)。其中關(guān)于Shader部分的主要是這個(gè)函數(shù):

void ShaderWidget::setShader()
{
    
if (!isValid())
    {
        
return;
    }

    
const QGLContext* aGlContext = context();

    QGLShaderProgram
* aShaderProgram = new QGLShaderProgram(aGlContext);

    aShaderProgram
->addShaderFromSourceFile(QGLShader::Vertex, "vertex.vert");
    aShaderProgram
->addShaderFromSourceFile(QGLShader::Fragment, "fragment.frag");

    aShaderProgram
->link();
    aShaderProgram
->bind();
    QString aLog 
= aShaderProgram->log();
}

先看一下沒(méi)有使用Shader之前的程序的效果圖:

wps_clip_image-23309

Figure 4.1 A teapot model without shader

其中添加兩個(gè)shader,一個(gè)是vertex shader: vertex.vert,一個(gè)是fragment shader:fragment.frag。在vertex shader中對(duì)頂點(diǎn)的坐標(biāo)進(jìn)行變換,代碼如下所示:

void main()
{
    vec4 a 
= gl_ModelViewProjectionMatrix * gl_Vertex;
    gl_Position.x 
= 0.4 * a.x;
    gl_Position.y 
= 0.1 * a.y;
}

OpenGL內(nèi)置變量gl_Position保存了當(dāng)前頂點(diǎn)的位置信息,上面的頂點(diǎn)著色器修改了每個(gè)頂點(diǎn)的X坐標(biāo)和Y坐標(biāo),使得輸出了一個(gè)扭曲的teapot。

片段著色器當(dāng)前片段的顏色改成紫色,片段著色器代碼如下:

void main()
{
    gl_FragColor 
= vec4(0.6270.1250.9411.0);
}

為了驗(yàn)證程序是使用了著色器,運(yùn)行程序得到如下圖所示:

wps_clip_image-28370

Figure 4.2 A Teapot with shader

在不重新編譯程序的情況下,只修改片段著色器中的代碼,改成如下所示內(nèi)容:

void main()
{
    gl_FragColor 
= vec4(0.6270.1250.01.0);
}

保存片段著色器代碼后直接運(yùn)行程序,可得到如下圖所示的紅色teapot:

wps_clip_image-24948

Figure 4.3 Change Fragment Shader

可以看到shader的確是起了作用。本文最后將給出程序的完整代碼及shader的代碼,便于測(cè)試。

5.Conclusion

OpenGL的Shader給了程序員對(duì)OpenGL的更多的控制權(quán),可對(duì)其頂點(diǎn)處理和片段處理進(jìn)行更個(gè)性化的配置以達(dá)到炫酷的效果。

Shader的使用步驟是先創(chuàng)建shader對(duì)象,再將源碼編譯到shader對(duì)象。最后通過(guò)shader程序,將shader添加并編譯、鏈接和使用。

最后在Qt中以一個(gè)簡(jiǎn)單的例子來(lái)驗(yàn)證了shader的效果,入門(mén)之后便于理解GLSL更詳細(xì)的功能,以使自己的可視化程序具有更高的性能,更酷的效果。

6. References

1. 仇德元. GPGPU編程技術(shù)—從GLSL、CUDA到OpenCL. 機(jī)械工業(yè)出版社. 2012

2. Randi J. Rost. OpenGL Shading Language. Addison Wesley. 2006

3. Dave Shreiner. OpenGL Programming Guide(7th). Addison-Wesley. 2009

 

Source Code and PDF Version: A Simple OpenGL Shader Example

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            免费亚洲一区二区| 亚洲视频电影图片偷拍一区| 欧美福利一区二区| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲免费一在线| 午夜电影亚洲| 久久国产精品黑丝| 麻豆精品视频| 欧美日韩国产三区| 国产精品激情| 国产日韩综合一区二区性色av| 狠狠色丁香婷婷综合影院 | 欧美亚洲第一页| 国产精品手机在线| 亚洲国产成人在线| 一区二区激情视频| 欧美在线综合视频| 亚洲成人资源网| 亚洲国产精品国自产拍av秋霞| 夜夜嗨av一区二区三区免费区| 欧美一级理论性理论a| 欧美激情第4页| 国产欧美欧美| 日韩亚洲欧美成人| 久久久人成影片一区二区三区观看| 欧美国产综合| 午夜久久久久| 欧美日韩亚洲免费| 在线观看91久久久久久| 亚洲一区二区三区精品动漫| 老鸭窝91久久精品色噜噜导演| 欧美精品手机在线| 一本色道久久加勒比88综合| 性色av一区二区三区在线观看 | 亚洲欧洲综合另类| 亚洲男女自偷自拍| 欧美福利网址| 伊人一区二区三区久久精品| 午夜久久福利| 日韩亚洲在线| 欧美激情视频给我| 亚洲高清精品中出| 欧美在线视频日韩| 亚洲美女免费精品视频在线观看| 久久精品欧洲| 国产亚洲一二三区| 性做久久久久久久免费看| 亚洲精品美女久久7777777| 久久免费视频在线观看| 国产亚洲精品一区二555| 亚洲伊人色欲综合网| 亚洲精品免费在线| 欧美久久婷婷综合色| 亚洲精品美女在线| 免费欧美视频| 久久在线观看视频| 狠狠色狠狠色综合日日小说| 久久精品国产99精品国产亚洲性色| 99国产精品视频免费观看一公开| 免费在线国产精品| 亚洲第一色在线| 免费成人av在线看| 麻豆精品在线播放| 日韩视频免费观看高清在线视频| 欧美成人免费小视频| 奶水喷射视频一区| 亚洲欧洲在线免费| 亚洲精品国产精品乱码不99按摩 | 国产一区二区久久精品| 香蕉久久精品日日躁夜夜躁| 亚洲视频在线一区| 国产欧美日韩一区二区三区在线观看| 欧美一区二区三区播放老司机| 一区二区高清视频在线观看| 国产精品久久久久久久久搜平片| 午夜亚洲激情| 久久精品女人| 亚洲精品国产精品国自产在线 | 日韩亚洲一区二区| 99视频精品免费观看| 国产精品福利网站| 久久精品国产一区二区三区| 久久高清免费观看| 亚洲区一区二区三区| 亚洲精品日产精品乱码不卡| 欧美视频在线免费| 亚洲在线日韩| 亚洲国产精品黑人久久久| 久久综合九九| 免费成人在线观看视频| 亚洲视频精品| 欧美一级电影久久| 亚洲国产成人精品久久| 99re成人精品视频| 国产一区三区三区| 亚洲国产成人在线播放| 欧美日精品一区视频| 久久先锋资源| 欧美乱在线观看| 久久精品成人欧美大片古装| 麻豆精品在线观看| 久久成人国产| 欧美日本免费| 老司机午夜免费精品视频| 欧美视频在线观看 亚洲欧| 麻豆精品传媒视频| 国产精品久久久| 欧美国产精品人人做人人爱| 国产精品私房写真福利视频| 亚洲第一精品夜夜躁人人躁| 国产热re99久久6国产精品| 91久久在线观看| 黄色日韩网站视频| 亚洲午夜日本在线观看| 亚洲免费成人av| 久久久久久久久久久一区| 香蕉精品999视频一区二区| 欧美另类在线播放| 亚洲国产欧美一区| 在线日韩av永久免费观看| 亚洲欧美成人一区二区在线电影| 日韩亚洲欧美在线观看| 老牛国产精品一区的观看方式| 久久国产福利| 国产精品一区二区久久国产| 99精品国产99久久久久久福利| 亚洲裸体视频| 欧美大学生性色视频| 免费观看一区| 亚洲高清av| 欧美jizzhd精品欧美喷水| 美女爽到呻吟久久久久| 一区二区三区在线不卡| 久久精品人人爽| 另类亚洲自拍| 亚洲高清视频一区| 免费日韩av片| 亚洲精品乱码久久久久久| 一本色道久久99精品综合| 欧美日韩精品在线观看| 日韩网站在线观看| 亚洲一区二区三区在线| 国产精品精品视频| 亚洲欧美日韩天堂一区二区| 久久精品国产77777蜜臀| 伊人激情综合| 欧美ed2k| 一本色道久久综合精品竹菊| 亚洲欧美激情视频| 国产日韩欧美自拍| 久久久久国产一区二区| 免费观看成人www动漫视频| 亚洲人成网站影音先锋播放| 欧美黄在线观看| 每日更新成人在线视频| 亚洲一区国产精品| 欧美中文字幕在线观看| 国产视频在线一区二区| 久久精品国内一区二区三区| 欧美成年人网站| 夜夜狂射影院欧美极品| 欧美三级电影精品| 午夜精品福利在线| 噜噜噜91成人网| 夜夜爽av福利精品导航| 国产精品素人视频| 久久国产精品网站| 亚洲黄色视屏| 午夜免费久久久久| 亚洲成色精品| 国产精品成人一区二区三区吃奶| 亚洲欧美国产va在线影院| 麻豆精品在线视频| 亚洲视频一区二区在线观看| 国产日韩亚洲| 欧美黄色大片网站| 香蕉久久夜色精品国产| 亚洲第一在线综合网站| 亚洲伊人网站| 亚洲国产老妈| 国产欧美日韩视频在线观看| 欧美极品一区| 久久精品国产免费观看| 一卡二卡3卡四卡高清精品视频| 久久婷婷丁香| 亚洲欧美文学| 99精品国产一区二区青青牛奶| 国产午夜久久| 国产精品国产三级国产aⅴ入口| 久久免费的精品国产v∧| 亚洲性xxxx| 亚洲精品综合精品自拍| 免费一区二区三区| 欧美自拍丝袜亚洲| 亚洲午夜女主播在线直播| 91久久综合| 亚洲第一精品影视| 激情丁香综合| 国产在线精品自拍| 国产精品影片在线观看|