W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
使用自定義shader渲染的材質。 shader是一個用GLSL編寫的小程序 ,在GPU上運行。 您可能需要使用自定義shader,如果你要:
使用ShaderMaterial時需要注意以下注意事項:
#pragma unroll_loop_start
for ( int i = 0; i < 10; i ++ ) {
// ...
}
#pragma unroll_loop_end
const material = new THREE.ShaderMaterial( {
uniforms: {
time: { value: 1.0 },
resolution: { value: new THREE.Vector2() }
},
vertexShader: document.getElementById( 'vertexShader' ).textContent,
fragmentShader: document.getElementById( 'fragmentShader' ).textContent
} );
webgl / buffergeometry / custom / attributes / particles
webgl / buffergeometry / selective / draw
webgl / custom / attributes
webgl / custom / attributes / lines
webgl / custom / attributes / points
webgl / custom / attributes / points2
webgl / custom / attributes / points3
webgl / depth / texture
webgl / gpgpu / birds
webgl / gpgpu / protoplanet
webgl / gpgpu / water
webgl / interactive / points
webgl / video / kinect
webgl / lights / hemisphere
webgl / marchingcubes
webgl / materials / envmaps
webgl / materials / lightmap
webgl / materials / wireframe
webgl / modifier / tessellation
webgl / postprocessing / dof2
webgl / postprocessing / godrays
您可以為每種材質指定兩種不同類型的shaders::
shader中有三種類型的變量: uniforms, attributes, 和 varyings:
注意:在shader 內部,uniforms和attributes就像常量;你只能使用JavaScript代碼通過緩沖區(qū)來修改它們的值。
WebGLRenderer默認情況下為shader提供了許多attributes和uniforms; 這些變量定義在shader程序編譯時被自動添加到*片元著色器*和*頂點著色器*代碼的前面,你不需要自己聲明它們。 這些變量的描述請參見WebGLProgram。
這些uniforms或attributes(例如,那些和照明,霧等相關的)要求屬性設置在材質上, 以便 WebGLRenderer來拷貝合適的值到GPU中。 如果你想在自己的shader中使用這些功能,請確保設置這些標志。
如果你不希望WebGLProgram 向你的shader代碼中添加任何東西, 你可以使用RawShaderMaterial 而不是這個類。
自定義attributes和uniforms必須在GLSL著色器代碼中聲明(在 vertexShader 和/或 fragmentShader 中)。 自定義uniforms必須定義為 ShaderMaterial 的 uniforms 屬性, 而任何自定義attributes必須通過BufferAttribute實例來定義。 注意 varyings 只需要在shader代碼中聲明(而不必在材質中)。
要聲明一個自定義屬性,更多細節(jié)請參考BufferGeometry頁面, 以及 BufferAttribute 頁面關于BufferAttribute 接口。
當創(chuàng)建attributes時,您創(chuàng)建的用來保存屬性數(shù)據(jù)的每個類型化數(shù)組(typed array)必須是您的數(shù)據(jù)類型大小的倍數(shù)。 比如,如果你的屬性是一個THREE.Vector3類型,并且在你的緩存幾何模型BufferGeometry中有3000個頂點, 那么你的類型化數(shù)組的長度必須是3000 * 3,或者9000(一個頂點一個值)。每個數(shù)據(jù)類型的尺寸如下表所示:
GLSL 類型 | JavaScript 類型 | 尺寸 |
---|---|---|
float | Number | 1 |
vec2 | THREE.Vector2 | 2 |
vec3 | THREE.Vector3 | 3 |
vec3 | THREE.Color | 3 |
vec4 | THREE.Vector4 | 4 |
請注意,屬性緩沖區(qū) 不會 在其值更改時自動刷新。要更新自定義屬性, 需要在模型的BufferAttribute中設置needsUpdate為true。 (查看BufferGeometry了解細節(jié))。
要聲明一個自定義的Uniform,使用uniforms屬性:
uniforms: {
time: { value: 1.0 },
resolution: { value: new THREE.Vector2() }
}
在Object3D.onBeforeRender中,建議根據(jù)object和camera來更新自定義Uniform的值。 因為 Material 可以被meshes,Scene的matrixWorld以及Camera共享, 會在WebGLRenderer.render中更新,并會對擁有私有cameras的scene的渲染造成影響。
parameters - (可選)用于定義材質外觀的對象,具有一個或多個屬性。 材質的任何屬性都可以從此處傳入(包括從Material繼承的任何屬性)。
共有屬性請參見其基類Material。
定義此材質是否支持剪裁; 如果渲染器傳遞clippingPlanes uniform,則為true。默認值為false。
當渲染的幾何體不包含這些屬性但材質包含這些屬性時,這些默認值將傳遞給shaders。這可以避免在緩沖區(qū)數(shù)據(jù)丟失時出錯。
this.defaultAttributeValues = {
'color': [ 1, 1, 1 ],
'uv': [ 0, 0 ],
'uv2': [ 0, 0 ]
};
使用 #define 指令在GLSL代碼為頂點著色器和片段著色器定義自定義常量;每個鍵/值對產生一行定義語句:
defines: {
FOO: 15,
BAR: true
}
這將在GLSL代碼中產生如下定義語句:
#define FOO 15
#define BAR true
一個有如下屬性的對象:
this.extensions = {
derivatives: false, // set to use derivatives
fragDepth: false, // set to use fragment depth values
drawBuffers: false, // set to use draw buffers
shaderTextureLOD: false // set to use shader texture LOD
};
定義材質顏色是否受全局霧設置的影響; 如果將fog uniforms傳遞給shader,則為true。默認值為false。
片元著色器的GLSL代碼。這是shader程序的實際代碼。在上面的例子中, vertexShader 和 fragmentShader 代碼是從DOM(HTML文檔)中獲取的; 它也可以作為一個字符串直接傳遞或者通過AJAX加載。
定義自定義著色器代碼的 GLSL 版本。僅與 WebGL 2 相關,以便定義是否指定 GLSL 3.0。有效值為 THREE.GLSL1 或 THREE.GLSL3。默認為空。
如果設置,則調用gl.bindAttribLocation 將通用頂點索引綁定到屬性變量。默認值未定義。
只讀標志,用于檢查給定對象是否屬于 ShaderMaterial 類型。
材質是否受到光照的影響。默認值為 false。如果傳遞與光照相關的uniform數(shù)據(jù)到這個材質,則為true。默認是false。
控制線框寬度。默認值為1。
由于OpenGL Core Profile與大多數(shù)平臺上WebGL渲染器的限制,無論如何設置該值,線寬始終為1。
定義材質是否使用平面著色進行渲染。默認值為false。
如下形式的對象:
{ "uniform1": { value: 1.0 }, "uniform2": { value: 2 } }
指定要傳遞給shader代碼的uniforms;鍵為uniform的名稱,值(value)是如下形式:
{ value: 1.0 }
這里 value 是uniform的值。名稱必須匹配 uniform 的name,和GLSL代碼中的定義一樣。 注意,uniforms逐幀被刷新,所以更新uniform值將立即更新GLSL代碼中的相應值。
可用于在 Object3D.onBeforeRender() 中更改制服時強制進行制服更新。默認為假。
定義是否使用頂點著色。默認為假。
頂點著色器的GLSL代碼。這是shader程序的實際代碼。 在上面的例子中,vertexShader 和 fragmentShader 代碼是從DOM(HTML文檔)中獲取的; 它也可以作為一個字符串直接傳遞或者通過AJAX加載。
將幾何體渲染為線框(通過GL_LINES而不是GL_TRIANGLES)。默認值為false(即渲染為平面多邊形)。
控制線框寬度。默認值為1。
由于OpenGL Core Profile與大多數(shù)平臺上WebGL渲染器的限制,無論如何設置該值,線寬始終為1。
共有方法請參見其基類Material。
創(chuàng)建該材質的一個淺拷貝。需要注意的是,vertexShader和fragmentShader使用引用拷貝; attributes的定義也是如此; 這意味著,克隆的材質將共享相同的編譯WebGLProgram; 但是,uniforms 是 值拷貝,這樣對不同的材質我們可以有不同的uniforms變量。
src/materials/ShaderMaterial.js
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: