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

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 閱讀(2250) 評論(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++非常類似,包括它的數據類型。GLSL有三種基本數據類型:float, int和bool,及由這些數據類型組成的數組和結構體。需要注意的是GLSL并不支持指針。

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

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

wps_clip_image-26489

Figure 1.1 OpenGL Training

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

2.GLSL Data Types

  GLSL內置了許多數據類型,使圖形操作的表達式計算更方便。布爾類型、整型、矩陣、向量及結構、數組等都包括在內。

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內置的很多變量及函數中就大量使用了向量。

Matrices

mat2

2x2 matrix of floating-point numbers

mat3

3x3 matrix of floating-point numbers

mat4

4x4 matrix of floating-point numbers

矩陣主要用來實現線性變換。

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特有的,所以它們都用在著色器內部聲明變量。

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

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

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

4.Code Example

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

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

實現的主要代碼在這兩個函數中:


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的函數uniformLocation()給GLSL中的變量用一個整數標記,對應在OpenGL中的函數是 GLint glGetUniformLocation(GLuint program, const char* name);再通過函數setUniformValue()來更新GLSL中變量的值,對應OpenGL中的函數為: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改名后,就會發現視圖一片漆黑,說明shader已經起作用了。

5.Conclusion

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

本文在Qt中測試了uniform變量效果,可以發現Qt對OpenGL的面向對象封裝還是很方便使用,也很容易找到與之對應的OpenGL函數。通過學習使用Qt中的OpenGL來方便學習理解OpenGL相關知識點。

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  回復  更多評論   

2015-12-01 17:05 by mmocake
GLSL三種基本類型學習了
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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| 亚洲自拍偷拍网址| 亚洲伦理网站| 久久九九热免费视频| 亚洲欧美网站| 欧美激情亚洲国产| 老**午夜毛片一区二区三区| 国产精品久久久久久超碰| 亚洲人成小说网站色在线| 国产在线不卡| 亚洲欧美精品伊人久久| 亚洲私人影院| 欧美日韩免费看| 亚洲国产精品久久91精品| 精品av久久久久电影| 亚洲自拍偷拍福利| 亚洲一二三区在线观看| 欧美成人亚洲成人日韩成人| 久久综合狠狠| 国产在线精品成人一区二区三区 | 免费看亚洲片| 国内精品美女在线观看| 欧美一级二区| 西西人体一区二区| 国产美女扒开尿口久久久| 亚洲性人人天天夜夜摸| 亚洲欧美国产一区二区三区| 国产精品初高中精品久久| aⅴ色国产欧美| 亚洲一区二区在线观看视频| 欧美日韩免费观看中文| 一本色道久久加勒比88综合| 亚洲一区二区伦理| 国产精品一区二区久久久久| 亚洲欧美日本日韩| 久久久蜜桃精品| 揄拍成人国产精品视频| 久久综合色综合88| 亚洲国产精品久久精品怡红院 | 亚洲尤物在线视频观看| 欧美视频一区二区三区| 亚洲在线观看视频网站| 久久精品30| 亚洲电影免费观看高清完整版在线观看 | 欧美成人免费网| 亚洲人体1000| 欧美日韩免费在线观看| 亚洲一区二区在线视频 | 久久这里只精品最新地址| 狠狠色丁香婷婷综合| 久久夜色精品国产亚洲aⅴ| 亚洲国产综合在线看不卡| 在线视频免费在线观看一区二区| 欧美午夜视频| 午夜宅男欧美| 亚洲人成绝费网站色www| 亚洲网站视频福利| 国产午夜精品一区二区三区视频| 久久另类ts人妖一区二区| 亚洲高清在线| 欧美与黑人午夜性猛交久久久| 亚洲国产精品黑人久久久| 欧美日韩中文字幕精品| 久久福利毛片| 亚洲精品在线免费| 久久久久久高潮国产精品视| 亚洲久久一区二区| 国产精品一区亚洲| 欧美va天堂| 亚洲欧美日韩国产成人精品影院 | 久久国产福利| 亚洲精品社区| 国内视频一区| 欧美视频一区在线| 久久久国产精品一区| 亚洲乱码久久| 一区二区三区久久久| 日韩视频一区二区三区| 国产欧美日本一区视频| 欧美激情按摩| 久久久久久久久综合| 宅男噜噜噜66一区二区66| 欧美gay视频激情| 欧美一区午夜精品| 国产精品99久久久久久宅男 | 亚洲一区日本| 亚洲欧洲精品一区二区三区波多野1战4 | 久久久久久网址| 亚洲一区二区欧美| 亚洲美女性视频| 在线成人激情| 国产亚洲毛片| 国产精品一区二区久久久| 欧美日本韩国一区二区三区| 老司机午夜免费精品视频| 欧美一区二区性| 亚洲欧美视频在线观看| 中文欧美字幕免费| 99国产精品久久久| 亚洲欧洲视频| 亚洲欧洲三级| 亚洲日本中文字幕区| 欧美国产高清| 欧美xxx在线观看| 麻豆成人综合网| 久久久久.com| 久久久久久久国产| 欧美一区二区三区四区在线 | 国产欧美精品| 国产精品日日摸夜夜摸av| 欧美日韩精品在线| 欧美日韩一区二区三区| 欧美日韩视频免费播放| 欧美日韩成人综合天天影院| 欧美区视频在线观看| 欧美日韩爆操| 欧美视频成人| 国产精品卡一卡二卡三| 国产精品专区h在线观看| 国产日韩欧美视频| 国内精品久久久久久久影视蜜臀 | 欧美在线综合| 久久精品免费| 六十路精品视频| 欧美激情一区二区三区不卡| 欧美极品在线播放| 国产精品v片在线观看不卡| 国产精品每日更新| 国产在线精品二区| 亚洲第一级黄色片| 99综合视频| 午夜一区二区三区不卡视频| 久久精品卡一| 欧美成人一品| 亚洲精品少妇30p| 亚洲制服丝袜在线| 久久久久久久一区二区三区| 女人色偷偷aa久久天堂| 欧美日韩精品二区| 国产一区导航| 亚洲蜜桃精久久久久久久| 亚洲男同1069视频| 美女黄色成人网| 最新亚洲电影| 欧美在线免费视屏| 欧美激情一区二区三区全黄 | 欧美国产激情| 亚洲美女电影在线| 亚洲欧美国产日韩天堂区| 玖玖玖国产精品| 国产精品国产精品国产专区不蜜| 国产一区二区久久精品| 99re成人精品视频| 久久久久国色av免费看影院| 亚洲国产日韩一区二区| 亚洲一区国产精品| 欧美 日韩 国产一区二区在线视频| 国产精品久久久久久久久搜平片 | 亚洲免费观看| 久久久97精品| 国产精品对白刺激久久久| 在线日韩日本国产亚洲| 亚洲一级免费视频| 欧美国产一区二区| 欧美亚洲免费电影| 欧美网站大全在线观看| 国内精品一区二区三区| 亚洲综合社区| 亚洲国产精品嫩草影院| 久久精品一区二区国产| 国产精品视频精品视频| 亚洲美女区一区| 免费不卡视频| 欧美一区日韩一区| 国产精品美女久久福利网站| 亚洲每日更新| 欧美成人自拍| 久久久久国产精品麻豆ai换脸| 国产精品尤物| 亚洲在线免费视频| 日韩一级片网址| 欧美国产日本高清在线| 最新国产成人av网站网址麻豆| 久久尤物视频| 欧美一级免费视频| 国产精品综合色区在线观看| 亚洲小说区图片区| 亚洲乱码国产乱码精品精可以看| 欧美第一黄网免费网站| 亚洲精品日韩一| 亚洲成人中文| 久久久久se| 香蕉成人久久| 国产午夜精品久久| 久久成年人视频| 久久狠狠亚洲综合| 在线观看一区二区精品视频| 欧美jizz19性欧美| 麻豆国产精品777777在线|