欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

OpenGL Shader in OpenCASCADE

系統(tǒng) 2122 0

OpenGL Shader in OpenCASCADE

eryar@163.com

Abstract. As implementation of one of the strategic steps in OpenCASCADE visualization component development road-map, support for GLSL shader programs has been added in OpenCASCADE Technology 6.7.0.?

Key Words. OpenCASCADE, GLSL, Shader, Gooch Shader

1. Introduction

OpenCASCADE從6.7.0之后,Shader程序也成了源碼的一部分。程序開發(fā)者可以為實(shí)現(xiàn)各種特效提供自己的Shader程序。在TKOpenGl庫中就有Shader相關(guān)的類,如下圖所示:

wps_clip_image-16881 wps_clip_image-26090

OpenCASCADE中的Shader管理是完全自動完成的,和其他OpenGL的資源一樣。仔細(xì)看看這幾個類相關(guān)的函數(shù),會發(fā)現(xiàn)與Qt中的Shader比較類似。對比使用,會加快對OpenGL Shader程序的理解。

在 OCCT6.7.0版本中的Shader程序還有一些局限性,如不能使用GLSL1.40版本或更新版本的功能。為了克服這個局限性,OCCT為了實(shí)現(xiàn)一 些shader的操作定義了一些uniform的變量,這樣Shader程序就不依賴于GLSL1.30定義的一些變量了,使程序的兼容性更好。在源文件 的Shaders文件夾中的Declarations.glsl中定義了這些變量,摘抄部分如下所示:

        
          //
        
        
           Vertex attributes
        
        
          #ifdef VERTEX_SHADER

  attribute vec4 occVertex;

  attribute vec3 occNormal;

  attribute vec4 occTexCoord;

  attribute vec4 occVertColor;


        
        
          #endif
        
        
          //
        
        
           Matrix state
        
        

uniform mat4 occWorldViewMatrix;  
        
          //
        
        
          !< World-view  matrix
        
        

uniform mat4 occProjectionMatrix; 
        
          //
        
        
          !< Projection  matrix
        
        

uniform mat4 occModelWorldMatrix; 
        
          //
        
        
          !< Model-world matrix
        
        
          

uniform mat4 occWorldViewMatrixInverse;    
        
        
          //
        
        
          !< Inverse of the world-view  matrix
        
        

uniform mat4 occProjectionMatrixInverse;   
        
          //
        
        
          !< Inverse of the projection  matrix
        
        

uniform mat4 occModelWorldMatrixInverse;   
        
          //
        
        
          !< Inverse of the model-world matrix
        
        
          

uniform mat4 occWorldViewMatrixTranspose;  
        
        
          //
        
        
          !< Transpose of the world-view  matrix
        
        

uniform mat4 occProjectionMatrixTranspose; 
        
          //
        
        
          !< Transpose of the projection  matrix
        
        

uniform mat4 occModelWorldMatrixTranspose; 
        
          //
        
        
          !< Transpose of the model-world matrix
        
        
          

uniform mat4 occWorldViewMatrixInverseTranspose;  
        
        
          //
        
        
          !< Transpose of the inverse of the world-view  matrix
        
        

uniform mat4 occProjectionMatrixInverseTranspose; 
        
          //
        
        
          !< Transpose of the inverse of the projection  matrix
        
        

uniform mat4 occModelWorldMatrixInverseTranspose; 
        
          //
        
        
          !< Transpose of the inverse of the model-world matrix
        
      

與OpenGL的內(nèi)置uniform變量對比會發(fā)現(xiàn),主要內(nèi)容都是類似的:

        
          //


        
        
          uniform mat4  gl_ModelViewMatrix;

uniform mat4  gl_ProjectionMatrix;

uniform mat4  gl_ModelViewProjectionMatrix;

uniform mat4  gl_TextureMatrix[gl_MaxTextureCoords];




        
        
          //
        
        
          //
        
        
           Derived matrix state that provides inverse and transposed versions


        
        
          //
        
        
           of the matrices above. Poorly conditioned matrices may result


        
        
          //
        
        
           in unpredictable values in their inverse forms.


        
        
          //


        
        uniform mat3  gl_NormalMatrix; 
        
          //
        
        
           transpose of the inverse of the upper

                               
        
        
          //
        
        
           leftmost 3x3 of gl_ModelViewMatrix
        
        
          

uniform mat4  gl_ModelViewMatrixInverse;

uniform mat4  gl_ProjectionMatrixInverse;

uniform mat4  gl_ModelViewProjectionMatrixInverse;

uniform mat4  gl_TextureMatrixInverse[gl_MaxTextureCoords];



uniform mat4  gl_ModelViewMatrixTranspose;

uniform mat4  gl_ProjectionMatrixTranspose;

uniform mat4  gl_ModelViewProjectionMatrixTranspose;

uniform mat4  gl_TextureMatrixTranspose[gl_MaxTextureCoords]



uniform mat4  gl_ModelViewMatrixInverseTranspose;

uniform mat4  gl_ProjectionMatrixInverseTranspose;

uniform mat4  gl_ModelViewProjectionMatrixInverseTranspose;

uniform mat4  gl_TextureMatrixInverseTranspose[gl_MaxTextureCoords]
        
      

看樣子OpenCASCADE為了GLSL版本兼容性也是動了些腦筋啊!

2.Test Shader

為 了方便在OpenCASCADE中測試自定義的Shader程序,OpenCASCADE在Draw Test Harness中提供了一個vshaderprog命令。如下圖所示為在Draw Test Harness中使用命令vshaderprog產(chǎn)生的Gouraud Shading和Phong Shading效果:

wps_clip_image-4915

Figure 2.1 Gouraud Shading(Left) and Phong Shading(right) by OCCT

在Draw Test Harness中使用vshaderprog命令很簡單,如下圖所示:

wps_clip_image-1384

Figure 2.2 vshaderprog usage

為指定的模型指定頂點(diǎn)著色器和片段著色器即可。

3.Gooch Shader

Gooch著色屬于非真實(shí)性圖像著色,主要用于繪制各種手冊、技術(shù)圖書上的示意圖。1998年,Bruce和Amy Gooch、Peter Shirley以及Elaine Cohen對示意圖進(jìn)行了調(diào)查并提出了使用噴槍和畫筆繪制的彩色示意圖特征:

v 表面邊界、輪廓邊緣及對象表面的不連續(xù)處通常是使用黑色曲線繪制;

v 使用一個單獨(dú)的光源,它會在對象上產(chǎn)生白色的高光;

v 光源通常位于對象的上方,這樣在對象的可見區(qū)域上,漫反射部分會在[0,1]中變化;

v ……

wps_clip_image-12173

Figure 3.1 Gooch Shader Effect

上圖所示為Gooch著色器渲染出來的效果,看上去是不是很有感覺啊!以上圖片來自Amy Gooch, Bruce Gooch, Peter Shirley和Elaine Cohen的論文:

A Non-Photorealistic Lighting Model For Automatic Technical Illustration.

Department of Computer Science University of Utah. Utah大學(xué)還有著名的Utah Teapot。

在《OpenGL Shading Language》一書中發(fā)現(xiàn)了Gooch著色器的相關(guān)實(shí)現(xiàn)代碼,如下所示:

頂點(diǎn)著色器Gooch.vs:

        
          //
        
        
          //
        
        
           Vertex shader for Gooch shading


        
        
          //
        
        
          //
        
        
           Author: Randi Rost


        
        
          //
        
        
          //
        
        
           Copyright (c) 2002-2005 3Dlabs Inc. Ltd. 


        
        
          //
        
        
          //
        
        
           See 3Dlabs-License.txt for license information


        
        
          //


        
        
          

uniform vec3  LightPosition;  
        
        
          //
        
        
           (0.0, 10.0, 4.0) 
        
        
          

varying 
        
        
          float
        
        
           NdotL;

varying vec3  ReflectVec;

varying vec3  ViewVec;




        
        
          void
        
        
           main()

{

    LightPosition 
        
        = vec3(
        
          0.0
        
        , 
        
          10.0
        
        , 
        
          4.0
        
        
          );

    

    vec3 ecPos      
        
        = vec3(gl_ModelViewMatrix *
        
           gl_Vertex);

    vec3 tnorm      
        
        = normalize(gl_NormalMatrix *
        
           gl_Normal);

    vec3 lightVec   
        
        = normalize(LightPosition -
        
           ecPos);

    ReflectVec      
        
        = normalize(reflect(-
        
          lightVec, tnorm));

    ViewVec         
        
        = normalize(-
        
          ecPos);

    NdotL           
        
        = (dot(lightVec, tnorm) + 
        
          1.0
        
        ) * 
        
          0.5
        
        
          ;

    gl_Position     
        
        =
        
           ftransform();

}
        
      

?

片段著色器Gooch.fs:

        
          //
        
        
          //
        
        
           Fragment shader for Gooch shading


        
        
          //
        
        
          //
        
        
           Author: Randi Rost


        
        
          //
        
        
          //
        
        
           Copyright (c) 2002-2005 3Dlabs Inc. Ltd. 


        
        
          //
        
        
          //
        
        
           See 3Dlabs-License.txt for license information


        
        
          //


        
        
          

uniform vec3  SurfaceColor; 
        
        
          //
        
        
           (0.75, 0.75, 0.75)
        
        

uniform vec3  WarmColor;    
        
          //
        
        
           (0.6, 0.6, 0.0)
        
        

uniform vec3  CoolColor;    
        
          //
        
        
           (0.0, 0.0, 0.6)
        
        

uniform 
        
          float
        
         DiffuseWarm;  
        
          //
        
        
           0.45
        
        

uniform 
        
          float
        
         DiffuseCool;  
        
          //
        
        
           0.45
        
        
          

varying 
        
        
          float
        
        
           NdotL;

varying vec3  ReflectVec;

varying vec3  ViewVec;




        
        
          void
        
        
           main()

{

    SurfaceColor 
        
        = vec3(
        
          0.75
        
        , 
        
          0.75
        
        , 
        
          0.75
        
        
          );

    WarmColor 
        
        = vec3(
        
          0.6
        
        , 
        
          0.6
        
        , 
        
          0.0
        
        
          );

    CoolColor 
        
        = vec3(
        
          0.0
        
        , 
        
          0.0
        
        , 
        
          0.6
        
        
          );

    DiffuseWarm 
        
        = 
        
          0.45
        
        
          ;

    DiffuseCool 
        
        = 
        
          0.45
        
        
          ;

    

    vec3 kcool    
        
        = min(CoolColor + DiffuseCool * SurfaceColor, 
        
          1.0
        
        
          );

    vec3 kwarm    
        
        = min(WarmColor + DiffuseWarm * SurfaceColor, 
        
          1.0
        
        
          ); 

    vec3 kfinal   
        
        =
        
           mix(kcool, kwarm, NdotL);



    vec3 nreflect 
        
        =
        
           normalize(ReflectVec);

    vec3 nview    
        
        =
        
           normalize(ViewVec);



    
        
        
          float
        
         spec    = max(dot(nreflect, nview), 
        
          0.0
        
        
          );

    spec          
        
        = pow(spec, 
        
          32.0
        
        
          );



    gl_FragColor 
        
        = vec4(min(kfinal + spec, 
        
          1.0
        
        ), 
        
          1.0
        
        
          );

}
        
      

將它們加載到OpenCASCADE中,顯示效果如下圖所示:

wps_clip_image-8706

Figure 3.2 A Main Engine in Draw Test Harness

wps_clip_image-24159

Figure 3.3 Use Gooch Shader Program

由上圖可知,Shader有一定的作用,但效果不是很理想。還需要學(xué)習(xí)相關(guān)的知識,才能完善。如果在OpenCASCADE中只修改下shader就可以得到各種特效,豈不快哉!

4.Conclusion

綜上所述,OpenGL的Shader是個很好玩的東西,所以O(shè)penCASCADE中引入了這個。為了保證GLSL的兼容性,OpenCASCADE也定義了一些變量。

在不改變程序源碼的情況下,只換上不同的shader,就可以得到各種炫麗的特效,這些特效主要是利用GPU的資源完成,不占用CPU。看OpenGL最新的規(guī)格書中,GLSL已經(jīng)越來越Fashion了!

5. References

1. Randi J. Rost. OpenGL Shading Language. Addison Wesley. 2006

2. Amy Gooch, Bruce Gooch, Peter Shirley, Elaine Cohen. A Non-Photorealistic Lighting Model For Automatic Technical Illustration. Department of Computer Science University of Utah.

3. San, Shader support in OCCT6.7.0. http://dev.opencascade.org/index.php?q=node/902

?

PDF version and Gooch Shader OpenGL Shader in OpenCASCADE

OpenGL Shader in OpenCASCADE


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日韩中文视频 | 日韩精品视频在线观看免费 | 深夜日韩| 天天综合色天天桴色 | 免费毛片看| a视频在线播放 | 国产专区在线视频 | 日本一在线中文字幕天堂 | 久久无码人妻中文国产 | 粉嫩粉嫩芽的虎白女18在线视频 | 色婷综合| 色综合天天综合中文网 | a毛片| 精品久久久久久久久久 | 91蝌蚪在线播放 | 精品一区二区久久久久久按摩 | 成人久久18免费游戏网站 | 欧美性高清视频免费看www | 午夜爱爱爱爱爽爽爽网站免费 | 天堂资源地址在线 | 狠狠操狠狠干 | 亚洲视频在线观看一区 | 大色综合 | 美女国产网站 | 又大又紧又硬又湿a视频 | 欧美成人一品道免费视频 | 国产++欧洲韩国野花视频 | 午夜伦理影院 | 在线精品国内外视频 | 久久一日本道色综合久久m 亚洲三级视频 | 性夜影院爽黄A爽免费动漫 日韩精品在线一区二区 | 成人精品一区二区 | 精品欧美在线精品 | 成人欧美一区在线视频在线观看 | 五月天天 | 五月婷婷六月丁香 | 精品国产欧美一区二区 | 国产精品久久久天天影视香蕉 | 91精品国产闺蜜国产在线 | 91久久亚洲精品一区二区 | 亚洲免费一区二区 |