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

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>
            亚洲欧洲三级电影| 欧美三级日本三级少妇99| 狠狠色2019综合网| 国产欧美日韩免费| 国产在线不卡视频| 激情综合网激情| 亚洲欧洲日本国产| 亚洲视频欧美视频| 久久国产一区二区| 欧美国产在线视频| 亚洲视频免费在线| 欧美一区二区三区视频在线观看| 欧美一区二区三区在线| 老司机精品视频网站| 国产精品播放| 精品999网站| 这里是久久伊人| 亚洲日本黄色| 亚洲在线电影| 一本久久综合亚洲鲁鲁| 亚洲欧美日韩精品久久亚洲区 | 欧美日韩美女在线观看| 国产精品久久97| 伊人夜夜躁av伊人久久| 亚洲天堂av综合网| 欧美1区2区3区| 亚洲精品国精品久久99热| 亚洲欧美综合一区| 欧美人成在线| 加勒比av一区二区| 亚洲一区二区成人| 欧美激情片在线观看| 亚洲自啪免费| 欧美日产国产成人免费图片| 有坂深雪在线一区| 性欧美办公室18xxxxhd| 亚洲精品一级| 欧美大香线蕉线伊人久久国产精品| 国产精品日韩久久久| 日韩午夜视频在线观看| 欧美aa国产视频| 亚洲欧美激情一区| 国产精品久久波多野结衣| 亚洲精品一区在线观看香蕉| 久久精品首页| 性色一区二区三区| 国产精品日韩一区| 亚洲天堂第二页| 夜夜爽99久久国产综合精品女不卡| 久久噜噜噜精品国产亚洲综合| 国产精品久久久久久久app| 日韩一级精品| 亚洲国产综合91精品麻豆| 久久亚洲国产成人| 一区二区三区在线观看国产| 久久精品国产在热久久| 欧美一级在线播放| 狠狠色2019综合网| 另类春色校园亚洲| 久久综合九色综合欧美就去吻| 国语自产在线不卡| 裸体一区二区三区| 老司机精品视频网站| 亚洲国产高清一区二区三区| 可以免费看不卡的av网站| 久久狠狠亚洲综合| 在线播放国产一区中文字幕剧情欧美| 久久久久九九九九| 另类天堂视频在线观看| 亚洲国产欧美精品| 亚洲精品国产精品乱码不99按摩 | 国产日韩欧美视频在线| 国产精品久久久久久超碰| 午夜亚洲福利| 久久精品女人的天堂av| 亚洲激情视频在线| 免费看成人av| 毛片一区二区三区| 99视频有精品| 亚洲一区二区三区涩| 国产日韩欧美精品一区| 蜜臀av在线播放一区二区三区| 蜜桃久久av一区| 亚洲视频免费| 欧美一区国产二区| 亚洲精品久久久久久久久久久久| 日韩午夜激情av| 国模一区二区三区| 亚洲国产激情| 国产欧美日韩精品专区| 欧美激情五月| 国产欧美激情| 亚洲精品国产精品乱码不99按摩| 国产精品亚洲成人| 亚洲成色999久久网站| 国产精品大片免费观看| 麻豆免费精品视频| 国产精品美女久久久免费| 欧美电影在线播放| 国产区精品在线观看| 亚洲人成人99网站| 好吊色欧美一区二区三区四区| 亚洲精品国产系列| 亚洲国产cao| 欧美一级片久久久久久久| 一本色道久久综合| 久久野战av| 久久久97精品| 国产精品女人网站| 亚洲激情在线播放| 国产一区二区三区四区老人| 日韩视频一区二区三区在线播放| 韩国三级电影一区二区| 亚洲一级网站| 亚洲一级二级| 欧美女主播在线| 欧美大片在线观看一区| 国产在线拍偷自揄拍精品| 亚洲视频免费在线| 亚洲调教视频在线观看| 欧美激情免费观看| 欧美激情一区二区在线 | 亚洲精品资源| 久久综合九色综合欧美狠狠| 久久精品综合网| 国产精品视频大全| 夜夜夜久久久| 亚洲天堂视频在线观看| 欧美日韩一区二区三区视频| 亚洲人成7777| 一本一本久久| 欧美日韩在线观看一区二区三区 | 最近中文字幕日韩精品| 最新国产成人在线观看| 亚洲欧洲在线视频| 亚洲国产专区| 欧美久久久久中文字幕| 亚洲国产美女精品久久久久∴| 亚洲高清视频一区| 麻豆成人av| 91久久精品日日躁夜夜躁国产| 亚洲破处大片| 欧美屁股在线| 亚洲天堂av在线免费| 亚洲欧美日韩精品在线| 国产欧美日韩另类视频免费观看| 新狼窝色av性久久久久久| 久久精品一区| 91久久精品国产91久久| 欧美精品入口| 亚洲一区二区伦理| 久久看片网站| 亚洲精品久久久久久下一站 | 久久综合色综合88| 亚洲人成在线观看| 亚洲欧美日韩久久精品| 国产亚洲人成a一在线v站 | 新片速递亚洲合集欧美合集| 老司机午夜精品视频在线观看| 亚洲国产精品精华液2区45| 欧美精品成人| 午夜精品福利视频| 欧美韩日高清| 亚洲欧美国产高清va在线播| 国产主播一区| 欧美日韩八区| 久久精品30| 在线视频亚洲欧美| 欧美超级免费视 在线| 亚洲免费在线观看| 亚洲福利视频在线| 国产精品视频福利| 美女脱光内衣内裤视频久久网站| 99re6这里只有精品| 久久偷看各类wc女厕嘘嘘偷窃| 亚洲日本一区二区三区| 国产乱码精品一区二区三区忘忧草| 久久露脸国产精品| 亚洲欧洲av一区二区| 亚洲精品一区二区三区在线观看 | 夜夜精品视频| 欧美韩日视频| 久久久久久欧美| 亚洲视屏一区| 亚洲激情中文1区| 国产亚洲成精品久久| 欧美日韩爆操| 裸体丰满少妇做受久久99精品| 亚洲综合色丁香婷婷六月图片| 亚洲国产精品高清久久久| 久久久国产亚洲精品| 宅男噜噜噜66一区二区 | 你懂的视频欧美| 久久久国产一区二区三区| 亚洲一区自拍| 亚洲小少妇裸体bbw| 日韩午夜在线播放| 亚洲电影激情视频网站| 国内精品视频666| 久久琪琪电影院|