最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

簡(jiǎn)單了解three.js 著色器材質(zhì)

 更新時(shí)間:2020年08月03日 09:52:48   作者:郭先生  
這篇文章主要介紹了three.js 著色器材質(zhì)的相關(guān)資料,文中講解非常詳細(xì),代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

說起three.js,著色器材質(zhì)總是繞不過的話題,今天郭先生就說一說什么是著色器材質(zhì)。著色器材質(zhì)是很需要靈感和數(shù)學(xué)知識(shí)的,可以用簡(jiǎn)短的代碼和繪制出十分豐富的圖像,可以說著色器材質(zhì)是脫離three.js的另一塊知識(shí),因此它十分難講,我們只能在一個(gè)一個(gè)案例中逐漸掌握著色器語(yǔ)言的使用技巧。

1. 什么是著色器材質(zhì)

著色器材質(zhì)(ShaderMaterial)是一個(gè)用GLSL編寫的小程序 ,在GPU上運(yùn)行。它能夠提供 materials 之外的效果,也可以將許多對(duì)象組合成單個(gè)Geometry或BufferGeometry以提高性能。

2. 著色器材質(zhì)的變量

每個(gè)著色器材質(zhì)都可以指定兩種不同類型的shaders,他們是頂點(diǎn)著色器和片元著色器(Vertex shaders and fragment shaders)。

  • 頂點(diǎn)著色器首先運(yùn)行; 它接收attributes, 計(jì)算/操縱每個(gè)單獨(dú)頂點(diǎn)的位置,并將其他數(shù)據(jù)(varyings)傳遞給片元著色器。
  • 片元(或像素)著色器后運(yùn)行; 它設(shè)置渲染到屏幕的每個(gè)單獨(dú)的“片元”(像素)的顏色。

shader中有三種類型的變量: uniforms, attributes, 和 varyings

  • Uniforms是所有頂點(diǎn)都具有相同的值的變量。 比如燈光,霧,和陰影貼圖就是被儲(chǔ)存在uniforms中的數(shù)據(jù)。 uniforms可以通過頂點(diǎn)著色器和片元著色器來訪問。
  • Attributes 與每個(gè)頂點(diǎn)關(guān)聯(lián)的變量。例如,頂點(diǎn)位置,法線和頂點(diǎn)顏色都是存儲(chǔ)在attributes中的數(shù)據(jù)。attributes 只 可以在頂點(diǎn)著色器中訪問。
  • Varyings 是從頂點(diǎn)著色器傳遞到片元著色器的變量。對(duì)于每一個(gè)片元,每一個(gè)varying的值將是相鄰頂點(diǎn)值的平滑插值。

注意:在shader 內(nèi)部,uniforms和attributes就像常量;你只能使用JavaScript代碼通過緩沖區(qū)來修改它們的值。

3. 著色器材質(zhì)的使用

上面說了每個(gè)著色器材質(zhì)都可以指定兩種不同類型的shaders,不過如果我們不去指定這兩個(gè)shaders而直接使用也不會(huì)報(bào)錯(cuò),因?yàn)镾haderMaterial已經(jīng)定義了默認(rèn)的頂點(diǎn)著色器和片元著色器,他們的代碼是這樣的。

//頂點(diǎn)著色器代碼
void main() {
  gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}
//片元著色器代碼
void main() {
  gl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );
}

這里的projectionMatrix、modelViewMatrix和position都是three為我們?cè)O(shè)置好的變量,可以直接拿來用,前兩個(gè)變量我們之前已經(jīng)說了,而position就是每一個(gè)頂點(diǎn)的坐標(biāo)值,當(dāng)著色器代碼執(zhí)行時(shí),會(huì)循環(huán)執(zhí)行g(shù)l_Position和gl_FragColor設(shè)置頂點(diǎn)位置,和顏色插值。并且我們最終要設(shè)置的就是gl_Position和gl_FragColor。多的先不說,下面看一個(gè)小例子。

var geom = new THREE.SphereGeometry(10, 30, 20);
var mate = new THREE.ShaderMaterial({
  vertexShader: `
  varying vec3 vNormal;
  void main() {
        //將attributes的normal通過varying賦值給了向量vNormal
    vNormal = normal;
        //projectionMatrix是投影變換矩陣 modelViewMatrix是相機(jī)坐標(biāo)系的變換矩陣 最后我們將y值乘以1.4得到了一個(gè)形如雞蛋的幾何體
    gl_Position = projectionMatrix * modelViewMatrix * vec4( position.x, position.y * 1.4, position.z, 1.0 );
  }
  `,
  fragmentShader: `
    //片元著色器同樣需要定義varying vec3 vNormal;
  varying vec3 vNormal;
  void main() {
        //vNormal是一個(gè)已經(jīng)歸一化的三維向量
    float pr = (vNormal.x + 1.0) / 2.0; //pr紅色通道值范圍為0~1
    float pg = (vNormal.y + 1.0) / 2.0; //pg綠色通道值范圍為0~1
    float pb = (vNormal.z + 1.0) / 2.0; //pb藍(lán)色通道值范圍為0~1
    gl_FragColor=vec4(pr, pg, pb, 1.0); //最后設(shè)置頂點(diǎn)顏色,點(diǎn)與點(diǎn)之間會(huì)自動(dòng)插值
  }
  `
})
var mesh = new THREE.Mesh(geom, mate);
scene.add(mesh)

這篇我們簡(jiǎn)單的操作頂點(diǎn)著色器和片元著色器繪制了一個(gè)五彩的雞蛋,但是這還僅僅是一個(gè)靜態(tài)的著色器,下一篇我們讓著色器材質(zhì)動(dòng)起來。

以上就是簡(jiǎn)單了解three.js 著色器材質(zhì)的詳細(xì)內(nèi)容,更多關(guān)于three.js 著色器材質(zhì)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 原生js實(shí)現(xiàn)下拉多選框組件完整代碼

    原生js實(shí)現(xiàn)下拉多選框組件完整代碼

    這篇文章主要給大家介紹了關(guān)于原生js實(shí)現(xiàn)下拉多選框組件的相關(guān)資料,工作中碰到的需求,模仿原生下拉框的樣式,可下拉多選,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • JavaScript中forEach和map詳細(xì)講解

    JavaScript中forEach和map詳細(xì)講解

    foreach和map都是JavaScript中數(shù)組的常用方法,它們都可以對(duì)數(shù)組中的每個(gè)元素執(zhí)行一個(gè)函數(shù),但是它們有一些區(qū)別,下面這篇文章主要給大家介紹了關(guān)于JavaScript中forEach和map詳細(xì)講解的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • 某人初學(xué)javascript的時(shí)候?qū)懙膶W(xué)習(xí)筆記

    某人初學(xué)javascript的時(shí)候?qū)懙膶W(xué)習(xí)筆記

    JavaScript對(duì)象就是一組屬性(方法)的集合 在該語(yǔ)言中如果變量名或方法名不符合聲明規(guī)范,則一定得用方括號(hào)“ [] ”引用它
    2010-12-12
  • 使用html2canvas截圖不全問題的解決辦法

    使用html2canvas截圖不全問題的解決辦法

    這篇文章主要給大家介紹了關(guān)于使用html2canvas截圖不全問題的解決辦法,最近在項(xiàng)目中遇到一個(gè)需求,需要提供網(wǎng)頁(yè)截圖的功能,這里將遇到的問題分享給大家,需要的朋友可以參考下
    2023-07-07
  • Firefox中autocomplete="off" 設(shè)置不起作用Bug的解決方法

    Firefox中autocomplete="off" 設(shè)置不起作用Bug的解決方法

    在實(shí)現(xiàn)補(bǔ)全提示功能時(shí)(Suggest),都會(huì)給輸入框(Input)元素添加autocomplete屬性,且值設(shè)為off。
    2011-03-03
  • TypeScript使用axios庫(kù)進(jìn)行高效的網(wǎng)頁(yè)數(shù)據(jù)抓取

    TypeScript使用axios庫(kù)進(jìn)行高效的網(wǎng)頁(yè)數(shù)據(jù)抓取

    在當(dāng)今的互聯(lián)網(wǎng)時(shí)代,數(shù)據(jù)已成為企業(yè)最寶貴的資產(chǎn)之一,無論是社交媒體分析、市場(chǎng)趨勢(shì)預(yù)測(cè)還是用戶行為研究,高效地獲取和處理網(wǎng)頁(yè)數(shù)據(jù)都是至關(guān)重要的,本文將通過訪問抖音平臺(tái)的案例,介紹如何在TypeScript中使用axios庫(kù)進(jìn)行高效的網(wǎng)頁(yè)數(shù)據(jù)抓取
    2024-08-08
  • document.getElementById的一些細(xì)節(jié)

    document.getElementById的一些細(xì)節(jié)

    document.getElementById的一些細(xì)節(jié)...
    2006-09-09
  • JavaScript實(shí)現(xiàn)動(dòng)態(tài)加載刪除表格

    JavaScript實(shí)現(xiàn)動(dòng)態(tài)加載刪除表格

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)動(dòng)態(tài)加載刪除表格,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • 基于JS實(shí)現(xiàn)父組件的請(qǐng)求服務(wù)過程解析

    基于JS實(shí)現(xiàn)父組件的請(qǐng)求服務(wù)過程解析

    這篇文章主要介紹了基于JS實(shí)現(xiàn)父組件的請(qǐng)求服務(wù)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Webpack性能優(yōu)化 DLL 用法詳解

    Webpack性能優(yōu)化 DLL 用法詳解

    本篇文章主要介紹了Webpack DLL 用法詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08

最新評(píng)論

延长县| 肃北| 光山县| 涿鹿县| 安宁市| 贵德县| 灌云县| 安溪县| 阳春市| 资溪县| 保康县| 濮阳县| 双辽市| 伊吾县| 九寨沟县| 宾川县| 潜江市| 集贤县| 邮箱| 长治县| 枝江市| 武乡县| 白玉县| 牙克石市| 临沧市| 辽阳市| 苍溪县| 昌黎县| 安阳市| 托克逊县| 永吉县| 滨州市| 湄潭县| 桃园市| 广灵县| 建瓯市| 营山县| 张掖市| 和龙市| 紫金县| 昭平县|