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

eryar

PipeCAD - Plant Piping Design Software.
PlantAssistant - Translate AVEVA RVM/SP3D VUE to glTF, STEP, etc.
posts - 606, comments - 590, trackbacks - 0, articles - 0

A Simple OpenGL Shader Example II

Posted on 2015-07-21 22:56 eryar 閱讀(2241) 評論(1)  編輯 收藏 引用 所屬分類: 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++非常類似,包括它的數(shù)據(jù)類型。GLSL有三種基本數(shù)據(jù)類型:float, int和bool,及由這些數(shù)據(jù)類型組成的數(shù)組和結(jié)構(gòu)體。需要注意的是GLSL并不支持指針。

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

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

wps_clip_image-26489

Figure 1.1 OpenGL Training

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

2.GLSL Data Types

  GLSL內(nèi)置了許多數(shù)據(jù)類型,使圖形操作的表達式計算更方便。布爾類型、整型、矩陣、向量及結(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的基本類型。

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

向量非常有用,可以用來存儲和操作顏色、位置、紋理坐標等等。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

矩陣主要用來實現(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個限定符可供使用,它們限定了被標記的變量不能被更改的范圍:

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++里的相同,表示限定的變量在編譯時不可被修改,即它標記了一個常量。const限定符是4個限定符中被標記變量不可被更改的范圍最大的。其余3個限定符是GLSL特有的,所以它們都用在著色器內(nèi)部聲明變量。

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

uniform限定符也標也一種全局變量,該變量對于一個圖元來說是不可改變的。同attribute限定符一樣,uniform可以從OpenGL應(yīng)用程序中接收傳遞過來的數(shù)據(jù)。uniform限定符可以用于頂點著色器和像素著色器。

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

4.Code Example

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

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

實現(xiàn)的主要代碼在這兩個函數(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");
}

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



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

運行程序,當程序視圖重繪時就會改變茶壺的顏色,如下圖所示:

wps_clip_image-2645wps_clip_image-5687

Figure 4.1 Test uniform variable in GLSL

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

5.Conclusion

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

本文在Qt中測試了uniform變量效果,可以發(fā)現(xiàn)Qt對OpenGL的面向?qū)ο蠓庋b還是很方便使用,也很容易找到與之對應(yīng)的OpenGL函數(shù)。通過學(xué)習使用Qt中的OpenGL來方便學(xué)習理解OpenGL相關(guā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ù)  更多評論   

2015-12-01 17:05 by mmocake
GLSL三種基本類型學(xué)習了
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲综合色丁香婷婷六月图片| 黄色国产精品一区二区三区| 亚洲私人影院| 亚洲特黄一级片| 午夜久久美女| 久久久久一区二区三区| 免费不卡欧美自拍视频| 欧美日韩第一区| 国产精品女同互慰在线看| 国产精品欧美经典| 在线播放亚洲一区| 在线亚洲欧美专区二区| 久久精品卡一| 91久久精品日日躁夜夜躁国产| 亚洲精品一区二区三区在线观看| 在线一区日本视频| 久久男人资源视频| 欧美午夜精品一区| 黄色亚洲网站| 亚洲一二三区在线| 裸体一区二区| 亚洲一区二区三区在线视频| 亚洲丝袜av一区| 欧美日韩第一区| 亚洲国产精品久久| 亚洲欧美激情四射在线日| 久久精品欧美日韩精品| 亚洲国产成人在线视频| 一本色道久久综合亚洲精品高清| 欧美在线三区| 国产精品高潮在线| 亚洲精品在线视频观看| 久久精品一区蜜桃臀影院| 91久久精品一区二区三区| 欧美中文日韩| 国产精品女人网站| 一本久久综合亚洲鲁鲁| 免费在线欧美视频| 亚洲欧美成人精品| 欧美午夜精品| 99在线|亚洲一区二区| 欧美成人一区二区三区在线观看| 午夜精品视频网站| 国产精品毛片高清在线完整版| 亚洲精品一区二区网址| 狂野欧美一区| 欧美在线欧美在线| 国产亚洲精品bv在线观看| 亚洲亚洲精品三区日韩精品在线视频| 玖玖综合伊人| 久久国产精彩视频| 国产一区二区三区成人欧美日韩在线观看| 亚洲专区国产精品| 一区二区三区四区国产精品| 欧美日本一区二区视频在线观看| 亚洲电影免费观看高清完整版在线观看| 亚洲欧美另类中文字幕| 一区二区三区日韩| 国产精品久久久久天堂| 亚洲中字在线| 亚洲在线视频网站| 国产偷久久久精品专区| 久久久国产精品一区二区中文| 性欧美在线看片a免费观看| 国产亚洲人成a一在线v站| 久久久久一区| 蜜臀av一级做a爰片久久| 亚洲人成久久| 日韩亚洲欧美综合| 国产精品麻豆va在线播放| 欧美一区三区二区在线观看| 性欧美精品高清| 激情亚洲成人| 欧美激情按摩在线| 欧美日本不卡高清| 亚洲欧美日韩一区二区在线| 欧美亚洲一级片| 有坂深雪在线一区| 亚洲国产你懂的| 欧美日本乱大交xxxxx| 国产精品v日韩精品| 亚洲视频高清| 宅男精品视频| 国产欧美日韩亚州综合| 久久影视精品| 欧美成人高清视频| 亚洲男女自偷自拍| 久久久国产91| 99视频日韩| 欧美一区二区在线视频| 亚洲国产天堂久久综合网| 亚洲精品一区二区三区在线观看| 国产精品青草久久| 欧美成人免费小视频| 欧美三级不卡| 老色鬼久久亚洲一区二区| 欧美精品一区二区精品网| 性欧美暴力猛交69hd| 麻豆91精品91久久久的内涵| 亚洲一区二区三区精品动漫| 久久久久久91香蕉国产| 亚洲自拍偷拍麻豆| 免费国产自线拍一欧美视频| 欧美在线视频免费| 欧美精品在线一区| 久久免费视频在线观看| 欧美日韩黄视频| 男男成人高潮片免费网站| 国产精品人成在线观看免费| 亚洲高清中文字幕| 国内成+人亚洲| 亚洲女同精品视频| 一区二区三区偷拍| 欧美大片91| 免费日韩av片| 国产一区二区日韩| 亚洲一区二区四区| 亚洲网在线观看| 欧美精品一区三区在线观看| 美女尤物久久精品| 国产一区二区欧美日韩| 亚洲一级二级在线| 在线亚洲伦理| 欧美欧美天天天天操| 亚洲国产精品免费| 在线视频国内自拍亚洲视频| 欧美一区二区三区在线观看 | 欧美三级在线视频| 亚洲日本va午夜在线影院| 亚洲成人直播| 久久免费黄色| 久久视频在线看| 国产在线观看91精品一区| 午夜精品999| 久久精品最新地址| 狠狠色综合播放一区二区| 亚洲欧美日韩在线观看a三区 | 亚洲国产精品视频| 亚洲激情第一区| 男同欧美伦乱| 亚洲美女av黄| 亚洲视频电影在线| 国产精品国产亚洲精品看不卡15 | 欧美色另类天堂2015| 亚洲人成艺术| 中日韩美女免费视频网址在线观看| 欧美成人免费网站| 亚洲精品欧美极品| 亚洲一区二区三区免费在线观看| 欧美私人网站| 亚洲欧美日本另类| 老司机一区二区| 亚洲欧洲精品一区二区三区| 欧美另类一区二区三区| 中文欧美日韩| 久久午夜电影| 亚洲精品男同| 国产精品久久久免费| 欧美一区二区视频网站| 欧美大胆人体视频| 亚洲一区二区三区乱码aⅴ| 国产精品亚洲欧美| 老鸭窝91久久精品色噜噜导演| 亚洲人成网站在线播| 欧美一级在线亚洲天堂| 在线日韩成人| 欧美日韩国产首页| 欧美亚洲一区二区三区| 亚洲成人在线视频网站| 亚洲夜间福利| 亚洲成人资源| 国产精品国产三级国产专区53 | 欧美在线播放视频| 伊人色综合久久天天| 欧美日韩亚洲成人| 久久久欧美一区二区| 日韩五码在线| 浪潮色综合久久天堂| 亚洲伊人伊色伊影伊综合网| 亚洲第一天堂av| 国产精品成人aaaaa网站| 久久精品72免费观看| 一区二区高清在线| 欧美成年人网站| 久久久999精品视频| 亚洲综合色在线| 亚洲人体偷拍| 国产亚洲日本欧美韩国| 欧美系列亚洲系列| 欧美成人精品一区二区| 欧美在线视频免费播放| 一区二区三区毛片| 亚洲精品在线一区二区| 蜜臀久久久99精品久久久久久 | 亚洲小说欧美另类社区| 亚洲电影免费在线| 免费日韩av片| 久久亚洲影音av资源网| 欧美一级播放| 国产欧美日韩另类视频免费观看|