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

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 II

Posted on 2015-07-21 22:56 eryar 閱讀(2233) 評(píng)論(1)  編輯 收藏 引用 所屬分類(lèi): 2.OpenCASCADE

A Simple OpenGL Shader Example II

eryar@163.com

Abstract. The OpenGL Shading Language syntax comes from the C family of programming languages. Tokes, identifiers, semicolons, nesting with curly braces, control-flow, and many key words look like C. GLSL provides three qualifiers which form the interfaces of the shaders to their outside world. 

Key Words. OpenGL, GLSL, Qualifiers, 

1. Introduction

GLSL的特性與C/C++非常類(lèi)似,包括它的數(shù)據(jù)類(lèi)型。GLSL有三種基本數(shù)據(jù)類(lèi)型:float, int和bool,及由這些數(shù)據(jù)類(lèi)型組成的數(shù)組和結(jié)構(gòu)體。需要注意的是GLSL并不支持指針。

GLSL中有4個(gè)限定符(Qualifier)可供使用,它們限定了被標(biāo)記的變量不能被更改的“范圍”。及通過(guò)這幾個(gè)限定符可以與OpenGL的程序來(lái)通信,即為OpenGL程序提供了一個(gè)將數(shù)據(jù)傳遞給Shader的界面(Interface to a Shader)。

OpenCASCADE中使用GLSL實(shí)現(xiàn)了Ray Tracing效果,剛開(kāi)始使用第三方庫(kù)OpenCL來(lái)使用GPU加速,最新版本統(tǒng)一使用GLSL。

wps_clip_image-26489

Figure 1.1 OpenGL Training

在《OpenGL高級(jí)編程技術(shù)培訓(xùn)教材》中,GLSL也是一個(gè)重要內(nèi)容。雖然當(dāng)時(shí)聽(tīng)得云里霧里,還是要感謝公司提供這樣的培訓(xùn)機(jī)會(huì)。

2.GLSL Data Types

  GLSL內(nèi)置了許多數(shù)據(jù)類(lèi)型,使圖形操作的表達(dá)式計(jì)算更方便。布爾類(lèi)型、整型、矩陣、向量及結(jié)構(gòu)、數(shù)組等都包括在內(nèi)。

Scalars

float

Declares a single floating-point number.

int

Declares a single integer number.

bool

Declares a single Boolean number.

這三種是GLSL的基本類(lèi)型。

Vectors

vec2

Vector of two floating-point numbers

vec3

Vector of three floating-point numbers

vec4

Vector of four floating-point numbers

ivec2

Vector of two integers

ivec3

Vector of three integers

ivec4

Vector of four integers

bvec2

Vector of two booleans

bvc3

Vector of three booleans

bvc4

Vector of four booleans

向量非常有用,可以用來(lái)存儲(chǔ)和操作顏色、位置、紋理坐標(biāo)等等。GLSL內(nèi)置的很多變量及函數(shù)中就大量使用了向量。

Matrices

mat2

2x2 matrix of floating-point numbers

mat3

3x3 matrix of floating-point numbers

mat4

4x4 matrix of floating-point numbers

矩陣主要用來(lái)實(shí)現(xiàn)線性變換。

Samplers

sampler1D

Accesses a one-dimensional texture

sampler2D

Accesses a two-dimensional texture

sampler3D

Accesses a three-dimensional texture

samplerCube

Accesses a cube-map texture

sampler1DShadow

Accesses a one-dimensional depth texture with comparison

sampler2DShadow

Accesses a two-dimensional depth texture with comparison

 

 

3.Qualifiers


GLSL有4個(gè)限定符可供使用,它們限定了被標(biāo)記的變量不能被更改的范圍:

Qualifiers

attribute

For frequently changing information, from the application to a vertex shader

uniform

For infrequently changing information, from the application to either a vertex shader or a fragment shader

varying

For interpolated information passed from a vertex shader to a fragment shader

const

For declaring nonwritable, compile-time constant variables as in C

 

const限定符和C/C++里的相同,表示限定的變量在編譯時(shí)不可被修改,即它標(biāo)記了一個(gè)常量。const限定符是4個(gè)限定符中被標(biāo)記變量不可被更改的范圍最大的。其余3個(gè)限定符是GLSL特有的,所以它們都用在著色器內(nèi)部聲明變量。

attribute限定符標(biāo)記的是一種全局變量,該變量被用作從OpenGL應(yīng)用程序向頂點(diǎn)著色器中傳遞參數(shù),因此該限定符僅用于頂點(diǎn)著色器。

uniform限定符也標(biāo)也一種全局變量,該變量對(duì)于一個(gè)圖元來(lái)說(shuō)是不可改變的。同attribute限定符一樣,uniform可以從OpenGL應(yīng)用程序中接收傳遞過(guò)來(lái)的數(shù)據(jù)。uniform限定符可以用于頂點(diǎn)著色器和像素著色器。

最后GLSL還提供了從頂點(diǎn)著色器向片段著色器傳遞數(shù)據(jù)的方法,即使用varying限定符。

4.Code Example

在《A Simple OpenGL Shader Example》中已經(jīng)成功實(shí)現(xiàn)了一個(gè)帶Shader的OpenGL程序。事實(shí)上這是兩個(gè)相對(duì)獨(dú)立的Shader,它們只能使用OpenGL內(nèi)置的變量從外部OpenGL程序中獲取一些數(shù)據(jù)。比如當(dāng)前頂點(diǎn)坐標(biāo)、當(dāng)前像素顏色等。這些Shader還沒(méi)有自定義的變量,以便從OpenGL程序中傳遞數(shù)據(jù)。通常程序的設(shè)計(jì)者需要在OpenGL程序中更好地控制shader的行為,這就需要從OpenGL程序向shader傳遞數(shù)據(jù)。

如上述的4個(gè)限定符,可以用來(lái)聲明變量幫助shader從外部獲取數(shù)據(jù)。其中uniform變量可以用來(lái)從OpenGL程序中給vertex shader或fragment shader傳遞數(shù)據(jù),最很常用的一個(gè)限定符變量。將《A Simple OpenGL Shader Example》中的程序稍做修改,使得片段shader可以收到一個(gè)來(lái)自O(shè)penGL程序里面的數(shù)據(jù)。

實(shí)現(xiàn)的主要代碼在這兩個(gè)函數(shù)中:


void ShaderWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT 
| GL_DEPTH_BUFFER_BIT);

    mAngle 
+= 0.1;
    glRotatef(mAngle, 
0.01.01.0);

    
// update uniform variable value
    mShaderProgram->setUniformValue(mTimeId, mAngle);

    glutSolidTeapot(
1.0);
    
//glutWireTeapot(1.0);
}
void ShaderWidget::setShader()
{
    
if (!isValid())
    {
        
return;
    }

    
const QGLContext* aGlContext = context();

    mShaderProgram 
= new QGLShaderProgram(aGlContext);

    
//mShaderProgram->addShaderFromSourceFile(QGLShader::Vertex, "vertex.vs");
    mShaderProgram->addShaderFromSourceFile(QGLShader::Fragment, "uniform.fs");

    mShaderProgram
->link();
    mShaderProgram
->bind();
    QString aLog 
= mShaderProgram->log();

    
// save the location of the uniform variable name within the shader program.
    mTimeId = mShaderProgram->uniformLocation("v_time");
}

首先通過(guò)QShaderProgram的函數(shù)uniformLocation()給GLSL中的變量用一個(gè)整數(shù)標(biāo)記,對(duì)應(yīng)在OpenGL中的函數(shù)是 GLint glGetUniformLocation(GLuint program, const char* name);再通過(guò)函數(shù)setUniformValue()來(lái)更新GLSL中變量的值,對(duì)應(yīng)OpenGL中的函數(shù)為:glUniform{1234}(if,ui}。最后只用了一個(gè)片段著色器,代碼如下所示:



// time(passed in from the application)
uniform float v_time; 

void main()
{
    
float fr = 0.9 * sin(0.0 + v_time*0.05+ 1.0;
    
float fg = 0.9 * cos(0.33 + v_time*0.05+ 1.0;
    
float fb = 0.9 * sin(0.67 + v_time*0.05+ 1.0;
    
    gl_FragColor 
= vec4(fr/2.0, fg/2.0, fb/2.01.0);
}

運(yùn)行程序,當(dāng)程序視圖重繪時(shí)就會(huì)改變茶壺的顏色,如下圖所示:

wps_clip_image-2645wps_clip_image-5687

Figure 4.1 Test uniform variable in GLSL

當(dāng)將uniform.fs中的v_time改名后,就會(huì)發(fā)現(xiàn)視圖一片漆黑,說(shuō)明shader已經(jīng)起作用了。

5.Conclusion

綜上所述,GLSL中通過(guò)限定符Qualifiers來(lái)實(shí)現(xiàn)OpenGL程序與GLSL的數(shù)據(jù)傳遞。其中uniform變量可以用來(lái)從OpenGL程序向片段著色器和頂點(diǎn)傳遞數(shù)據(jù),是很常用的一種方式。

本文在Qt中測(cè)試了uniform變量效果,可以發(fā)現(xiàn)Qt對(duì)OpenGL的面向?qū)ο蠓庋b還是很方便使用,也很容易找到與之對(duì)應(yīng)的OpenGL函數(shù)。通過(guò)學(xué)習(xí)使用Qt中的OpenGL來(lái)方便學(xué)習(xí)理解OpenGL相關(guān)知識(shí)點(diǎn)。

6. References

1. san. Shader support in OCCT6.7.0. http://dev.opencascade.org/index.php?q=node/902

2. Qt Assistant.

PDF version and Source code: A Simple OpenGL Shader Example II

Feedback

# re: A Simple OpenGL Shader Example II  回復(fù)  更多評(píng)論   

2015-12-01 17:05 by mmocake
GLSL三種基本類(lèi)型學(xué)習(xí)了
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲一区二区三区精品在线| 亚洲欧美卡通另类91av| 欧美日本精品| 欧美日韩亚洲成人| 国产精品国产精品| 国产日韩一区二区三区| 在线观看精品视频| 日韩亚洲精品电影| 午夜精品久久久久久久99水蜜桃| 欧美一级黄色网| 久久婷婷麻豆| 亚洲精品偷拍| 欧美在线看片| 欧美国产一区二区| 国产精品午夜av在线| 在线观看成人av| 99在线精品视频在线观看| 亚洲欧美日韩精品久久亚洲区 | 欧美成人一区二免费视频软件| 欧美大学生性色视频| 99视频在线精品国自产拍免费观看| 亚洲免费视频一区二区| 男女视频一区二区| 国产精品人人爽人人做我的可爱| 黄色av日韩| 亚洲一区二区三| 欧美寡妇偷汉性猛交| 亚洲视频一区二区在线观看| 久久精品久久99精品久久| 欧美日韩日本国产亚洲在线| 在线国产亚洲欧美| 欧美一区=区| 91久久国产综合久久| 亚洲欧美日韩精品一区二区| 欧美激情第9页| 亚洲风情在线资源站| 欧美一级成年大片在线观看| 亚洲精品一区久久久久久| 久久久久国内| 国产亚洲综合精品| 午夜精彩视频在线观看不卡| 最新日韩中文字幕| 美女图片一区二区| 一区二区三区日韩精品| 亚洲一区二区在线看| 欧美电影免费观看大全| 精品999成人| 久久久久久久999精品视频| 在线一区二区三区四区五区| 欧美日韩岛国| 在线综合亚洲| 日韩亚洲欧美成人| 欧美另类高清视频在线| 亚洲精品乱码久久久久久久久 | 久久综合导航| 狠狠综合久久av一区二区小说| 欧美在线播放高清精品| 亚洲综合电影| 国产亚洲女人久久久久毛片| 午夜精品久久久久久久| 亚洲欧美色一区| 国产一区二区0| 久久影院午夜片一区| 久久精品2019中文字幕| 精品盗摄一区二区三区| 欧美高清在线播放| 欧美屁股在线| 亚洲影院色在线观看免费| 一区二区三区欧美在线| 国产精品美女xx| 欧美在线亚洲在线| 久久精品一区| 亚洲精品视频在线观看网站| 亚洲久久在线| 国产精品剧情在线亚洲| 久久精品主播| 欧美激情国产日韩精品一区18| 在线视频一区观看| 欧美一区二区播放| 亚洲国产精品一区二区第四页av | 亚洲欧洲精品一区二区三区 | 一本大道久久a久久精二百| 欧美日精品一区视频| 性欧美xxxx大乳国产app| 久久电影一区| 一本色道久久综合亚洲91| 亚洲天堂免费观看| 一区二区三区在线免费观看| 亚洲黄色在线观看| 国产精品久久久久一区| 欧美成人亚洲成人日韩成人| 欧美日韩一视频区二区| 久久久国产精品一区| 欧美金8天国| 久久久亚洲一区| 欧美激情亚洲自拍| 免费人成精品欧美精品| 国产伦理一区| 日韩一二在线观看| 亚洲视频网在线直播| 在线观看欧美精品| 在线亚洲观看| 亚洲精品国产精品乱码不99| 亚洲男女自偷自拍| 一区二区国产在线观看| 久久影院午夜论| 性欧美超级视频| 欧美**人妖| 久久亚洲精品一区二区| 国产精品成人av性教育| 欧美激情小视频| 国产在线观看精品一区二区三区| 亚洲精品国精品久久99热一| 激情视频一区| 亚洲综合三区| 亚洲一区三区电影在线观看| 欧美成人精品h版在线观看| 久久综合99re88久久爱| 国产欧美日韩91| 亚洲一二区在线| 亚洲视频视频在线| 欧美日本一区| 亚洲欧洲午夜| 日韩亚洲精品在线| 欧美国产高潮xxxx1819| 亚洲高清资源| 亚洲理论在线| 欧美精品一级| 99视频国产精品免费观看| 99国产麻豆精品| 欧美日韩福利视频| 日韩视频久久| 亚洲欧美国产精品桃花| 国产精品久久久爽爽爽麻豆色哟哟 | 夜夜嗨av色一区二区不卡| 亚洲精品日韩欧美| 欧美精品日韩www.p站| 亚洲国产专区校园欧美| 日韩午夜中文字幕| 欧美日韩国产在线播放| 99re成人精品视频| 亚洲主播在线| 国产日本欧美一区二区| 欧美一区二区在线免费观看| 久久精品伊人| 亚洲高清不卡在线| 欧美极品aⅴ影院| 亚洲婷婷在线| 久久久www成人免费无遮挡大片| 黄色国产精品| 欧美福利一区二区| 在线一区欧美| 久久午夜精品一区二区| 亚洲精品乱码久久久久久按摩观 | 老色鬼久久亚洲一区二区| 韩日精品中文字幕| 欧美r片在线| 在线视频精品一区| 久久网站热最新地址| 久久久久国产精品一区| 亚洲电影成人| 亚洲午夜久久久| 国产亚洲精品bv在线观看| 久久只精品国产| 99热在这里有精品免费| 久久久久.com| 夜夜嗨av一区二区三区中文字幕| 国产精品久久久久免费a∨大胸| 久久av一区二区三区亚洲| 亚洲国产精品国自产拍av秋霞| 亚洲免费视频成人| 亚洲二区视频| 国产毛片一区二区| 免费观看亚洲视频大全| 亚洲男女毛片无遮挡| 亚洲黄色性网站| 久久久综合网| 亚洲欧美日韩国产成人| 亚洲欧洲一区二区在线观看| 国产欧美日韩伦理| 欧美精品精品一区| 久久一区激情| 亚洲男女自偷自拍| 日韩小视频在线观看| 欧美福利视频网站| 久久精品综合| 亚洲欧美视频在线| 99re热精品| 亚洲激情视频在线播放| 国产亚洲亚洲| 国产精品一区二区视频| 欧美日韩中文字幕日韩欧美| 久久综合影视| 欧美综合77777色婷婷| 亚洲综合日韩| 亚洲午夜在线| 国产精品99久久久久久久vr| 亚洲美女网站| 亚洲精品久久久久久久久| 欧美黄色免费|