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

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 閱讀(5101) 評論(0)  編輯 收藏 引用 所屬分類: 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

很早之前,從網上下載到這么一本書《OpenGL Shading Language》,翻看了幾遍,終不得要領。后來看到一本由仇德元編寫的《GPGPU編程技術—從GLSL、CUDA到OpenCL》,對GPU的了新的認識,對其性能刮目相看。書中給出的一個簡單例子,也便于對Shader的入門。

wps_clip_image-22807 wps_clip_image-16315

Figure 1.1 OpenGL Shading Language and GPGPU

從OpenGL Shading Language的出現可以發現程序員的一個特點,那就是不喜歡一成不變的東西,希望自己有更多的控制權,有個性,向往自由。如果要有個性,那就要引入這個新的東西GLSL了,增加了學習成本。不過從OpenGL2.0之后,Shader已經成了OpenGL標準的一部分,新版的OpenGL的書籍中都少不了shader的內容。Shader成了真實感圖形、高性能計算中不可或缺的技術,學習掌握新的工具是為了生活更輕松。

為了讓例子簡單,本文在Qt中實現了一個簡單的Shader示例,通過這個例子入門后,再結合《OpenGL Shading Language》去實現更炫的效果。再者就是去理解OpenCASCADE中的shader應用。

2.OpenGL operation pipeline

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

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

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

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

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

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

v 最后幀緩存里面的結果被刷新到顯示器上。該過程以較高的頻率重復,因為人的視頻延遲,感覺到的就是連續的。

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的渲染管線想成有兩個機器來完成主要的工作:一個機器處理頂點;一個處理片段。對于早期的OpenGL而言,只是兩個機器是內置的,程序員不能改變他們的工作方式。

wps_clip_image-20622

Figure 2.3 The OpenGL Fixed-Function Pipeline[3]

然而可編程的Shader(programmable shader)則是可以對這兩個機器的工作進行干預。

3.Using GLSL Shaders

當你想在程序中使用一個頂點Shader或片段Shader時,需要按如下步驟進行:

v 創建一個Shader對象;

v 將Shader的源文件編譯到這個對象;

v 驗證源文件是否編譯成功;

然后將這些shader鏈接到一個Shader程序:

v 創建一個Shader程序;

v 將創建的Shader對象綁定到這個Shader程序;

v 鏈接Shader程序;

v 驗證鏈接是否成功;

v 將shader對象應用到頂點及片段的處理;

如下圖所示:

wps_clip_image-9757

Figure 3.1 Shader Creation Flowchart

4.The simplest Shader Example

本來想用glut來寫個簡單的例子的,但是識別不了glCreateShader這種函數,發現要下載一些第三方庫才可以,如glew。看到Qt中已經有封裝好的QGLShader和QGLShaderProgram,所以還是決定用Qt來寫個簡單的例子,從而來對OpenGL的shader有個感性的認識。其中關于Shader部分的主要是這個函數:

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();
}

先看一下沒有使用Shader之前的程序的效果圖:

wps_clip_image-23309

Figure 4.1 A teapot model without shader

其中添加兩個shader,一個是vertex shader: vertex.vert,一個是fragment shader:fragment.frag。在vertex shader中對頂點的坐標進行變換,代碼如下所示:

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

OpenGL內置變量gl_Position保存了當前頂點的位置信息,上面的頂點著色器修改了每個頂點的X坐標和Y坐標,使得輸出了一個扭曲的teapot。

片段著色器當前片段的顏色改成紫色,片段著色器代碼如下:

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

為了驗證程序是使用了著色器,運行程序得到如下圖所示:

wps_clip_image-28370

Figure 4.2 A Teapot with shader

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

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

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

wps_clip_image-24948

Figure 4.3 Change Fragment Shader

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

5.Conclusion

OpenGL的Shader給了程序員對OpenGL的更多的控制權,可對其頂點處理和片段處理進行更個性化的配置以達到炫酷的效果。

Shader的使用步驟是先創建shader對象,再將源碼編譯到shader對象。最后通過shader程序,將shader添加并編譯、鏈接和使用。

最后在Qt中以一個簡單的例子來驗證了shader的效果,入門之后便于理解GLSL更詳細的功能,以使自己的可視化程序具有更高的性能,更酷的效果。

6. References

1. 仇德元. GPGPU編程技術—從GLSL、CUDA到OpenCL. 機械工業出版社. 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| 国产精品私拍pans大尺度在线 | 激情视频亚洲| 亚洲人成免费| 好吊妞**欧美| 中文国产成人精品久久一| 亚洲国产成人91精品| 亚洲综合大片69999| 亚洲精品久久7777| 欧美在线日韩| 日韩视频一区| 在线免费观看日本欧美| 亚洲天堂网站在线观看视频| 亚洲激情网站免费观看| 久久精品91| 性欧美超级视频| 欧美日韩免费精品| 欧美激情五月| 伊人影院久久| 欧美在线999| 欧美一区永久视频免费观看| 欧美色区777第一页| 亚洲欧洲美洲综合色网| 亚洲福利视频网| 久久精品一区二区三区中文字幕| 午夜精品免费在线| 欧美午夜三级| 中文在线一区| 亚洲影视在线播放| 欧美日韩高清不卡| 亚洲精品中文字幕有码专区| 亚洲激情视频在线播放| 乱码第一页成人| 欧美不卡视频| 亚洲高清资源综合久久精品| 久久女同互慰一区二区三区| 久久免费一区| 在线观看视频一区| 久久久999精品免费| 蜜臀91精品一区二区三区| 国产一区二区三区在线观看免费| 欧美在线精品免播放器视频| 久久精品国产99国产精品澳门 | 久久国产手机看片| 麻豆精品91| 亚洲欧洲视频| 欧美理论在线| 一区二区三区日韩精品视频| 亚洲欧洲av一区二区| 国产欧美日韩视频一区二区| 小辣椒精品导航| 久久人人爽人人| 亚洲高清网站| 欧美日韩精品一区二区天天拍小说| 亚洲激情午夜| 香蕉久久一区二区不卡无毒影院 | 亚洲欧美在线看| 国产有码在线一区二区视频| 久久综合99re88久久爱| 亚洲福利视频一区二区| 亚洲私拍自拍| 国产视频一区二区在线观看| 久久免费少妇高潮久久精品99| 亚洲国产成人高清精品| 亚洲一区二区在线观看视频| 国产一区二区三区久久久| 欧美成人精品h版在线观看| 99精品视频免费全部在线| 久久国内精品视频| 亚洲乱码国产乱码精品精| 欧美午夜电影网| 久久婷婷麻豆| 一本色道久久综合亚洲精品小说 | 久久人人爽爽爽人久久久| 亚洲国产精品一区制服丝袜| 亚洲一区二区三区国产| 国产一区二区在线观看免费播放 | 久久深夜福利| 亚洲综合不卡| 亚洲欧洲精品一区二区| 久久激情一区| 在线视频日韩| 亚洲国产综合视频在线观看| 国产毛片精品视频| 欧美日韩国产高清| 久久久久成人精品| 亚洲伊人观看| 最新精品在线| 免费试看一区| 久久精品中文| 午夜精品久久久久久久| 99re热精品| 亚洲黄色小视频| 国内精品国语自产拍在线观看| 欧美日韩免费一区二区三区视频| 久久―日本道色综合久久| 亚洲欧洲99久久| 中文av一区二区| 亚洲乱码一区二区| 亚洲高清在线视频| 免费成人激情视频| 久久视频免费观看| 久久久www成人免费无遮挡大片| 一区二区日韩欧美| 日韩一级在线观看| 99热这里只有精品8| 91久久嫩草影院一区二区| 亚洲成色777777女色窝| 精品av久久久久电影| 国产一区二区剧情av在线| 国产精品视频免费在线观看| 国产精品久久久久久户外露出| 欧美久久久久久蜜桃| 欧美精品激情blacked18| 欧美国产一区在线| 欧美激情第8页| 欧美日韩精品福利| 欧美日韩国产亚洲一区| 欧美日韩免费观看一区二区三区| 欧美人成免费网站| 欧美日精品一区视频| 欧美日韩在线播| 国产精品乱码人人做人人爱| 国产精品久久久久久妇女6080 | 在线观看一区视频| 亚洲日韩第九十九页| 99re8这里有精品热视频免费| 99在线|亚洲一区二区| 制服诱惑一区二区| 午夜影院日韩| 久久免费视频在线观看| 欧美黄网免费在线观看| 亚洲区国产区| 亚洲一区二区在线看| 性18欧美另类| 欧美成年视频| 国产精品啊啊啊| 韩日精品视频| 日韩一区二区精品视频| 欧美亚洲一区二区在线| 免费视频一区二区三区在线观看| 亚洲国产精品第一区二区| 一本色道久久综合精品竹菊 | 亚洲一区二区三区激情| 久久精品日韩一区二区三区| 午夜激情综合网| 国模一区二区三区| 亚洲国产视频a| 亚洲伊人观看| 免费成人av| 亚洲图片欧美一区| 久久久久久一区二区三区| 欧美日韩ab片| 国内激情久久| 亚洲亚洲精品在线观看 | 亚洲在线日韩| 免费人成网站在线观看欧美高清| 亚洲免费黄色| 久久久久在线| 国产精品一区二区久久久| 亚洲国产va精品久久久不卡综合| 午夜激情综合网| 亚洲国产婷婷| 久久精品视频免费| 国产精品对白刺激久久久| 亚洲国产精品久久久久婷婷老年 | 亚洲一卡二卡三卡四卡五卡| 男女激情视频一区| 亚洲永久免费观看| 欧美久久综合| 亚洲精品一区二区三区樱花| 久久精品夜色噜噜亚洲aⅴ| 99在线热播精品免费99热| 久久野战av| 韩国三级在线一区| 久久av二区| 亚洲欧美日韩综合| 国产精品第一页第二页第三页|