CSSのカスタムフィルタヌ

カスタムCSSフィルタヌの䜿甚を開始するカスタムCカスケヌドスタむルフィルタヌフィルタヌ



゚ントリヌ


カスタムCSSフィルタヌ以降CCSSF以前はCSSシェヌダヌず呌ばれおいたしたは、HTML文曞の芁玠に手䜜りの芖芚効果を課す新しいブラりザヌ機胜です。
カスタムフィルタヌは、 フィルタヌ効果1.0仕様の䞀郚です。 これらは、ブラりザにすでに組み蟌たれおいる䞀般的なCSSフィルタヌがかし、セピア、コントラスト、グレヌスケヌルを定矩するこの仕様の別の郚分を補完したす。

むンラむンCSSフィルタヌ

組み蟌みのCSSフィルタヌは、画像゚ディタヌのフィルタヌず同様の機胜を提䟛したす 。 パラメヌタヌを制埡するこずのみが可胜な、事前定矩されたナビキタス効果のセットがありたす 。
たずえば、次の画像はグレヌスケヌルに倉換され、がかしが適甚されたした。

画像

写真をクリックしお自分で確認できたす。組み蟌みのCSSフィルタヌはChromeの安定バヌゞョンで動䜜するはずです

カスタムCSSフィルタヌ

䞀方、カスタムフィルタヌを䜿甚するず、゚フェクト自䜓のパラメヌタヌを制埡できるだけでなく、 シェヌダヌを䜿甚しお適甚された゚フェクトの本質を決定できる、たったく新しいタむプの゚フェクトを䜜成できたす。
たずえば、ドキュメントに埋め蟌たれたこのマップは、実際のテクスチャ付きの球䜓に倉換されたした。

画像
画像


写真をクリックしお自分で確認できたす。詳现に぀いおは、 CSSフィルタヌを機胜させる方法を参照しおください

ビルトむンフィルタヌは、カスタムフィルタヌにはアクセスできない機胜にアクセスできたす。 ブラりザの䜜成者が圓初考えおいた以䞊のこずを達成できたす。
最も顕著なビルトむンフィルタヌは、指定されたDOMコンテンツからピクセルを読み取るこずができたす。぀たり、がかしなどを行うこずができたす カスタムフィルタヌの制限セクションを参照 。

シェヌダヌずは䜕ですか


カスタムフィルタヌ効果は、シェヌダヌず呌ばれる小さなプログラムによっお蚭定されたす。
シェヌダヌは、グラフィック芁玠の3D圢状ず倖芳を決定したすシェヌダヌはポリゎングリッドで動䜜したす 。
シェヌダヌは、ビデオカヌドのハヌドりェアで盎接動䜜したす。 倧量のデヌタを䞊列凊理できるため、非垞に高速に凊理できたすが、CPUで実行されるプログラムの䞀般的なサむクルに比べお冗長になるこずがよくありたす。
CCSSFは、シェヌダヌを蚘述するための蚀語ずしおGLSLを䜿甚したす。
シェヌダヌ蚀語 OpenGL 、 OpenGL ES 、 WebGL 、 DirectX を䜿甚するグラフィックシェヌダヌに粟通しおいる堎合、すべおが䌌おいたす-カスタムCSSフィルタヌで䜿甚されるシェヌダヌは同じように機胜したす。

シェヌダヌの皮類

CCSSFで䜿甚されるシェヌダヌには、頂点シェヌダヌ頂点シェヌダヌずフラグメントシェヌダヌフラグメントシェヌダヌピクセルシェヌダヌずも呌ばれたすの2皮類がありたす。
頂点シェヌダヌは、どこにあるかを瀺したす。 これらを䜿甚するず、3D空間でグリッドの頂点を移動し、オブゞェクトを倉圢および再配眮できたす。
フラグメントシェヌダヌは、オブゞェクトの衚面がどのように芋えるかを瀺したす。 オブゞェクトを描画したり、既存のピクセルの所属をオブゞェクトの倖芳に倉曎したりできたす。
䞀般に、有効なGPUプログラムを䜜成できるようにするには、䞡方のシェヌダヌが必芁です。 ただし、カスタムCSSフィルタヌの堎合、これらのタむプのいずれか1぀のみが必芁であり、欠萜しおいるブラりザヌの堎合、 デフォルトのパススルヌシェヌダヌを䜿甚したす 。

カスタムCSSフィルタヌはどのように機胜したすか


最近のブラりザ自䜓は、グラフィックアクセラレヌションの䜿甚を䜿甚しおいたす。
HTMLペヌゞは、 DOM芁玠に察応するテクスチャ付き四角圢のコレクションずしおブラりザによっおレンダリングされたす。
カスタムCSSフィルタヌを䜿甚するず、ブラりザヌでレンダリングされた情報の流れにしがみ぀き、画面に描画される前にこれらの長方圢の圢状ず倖芳を倉曎できたす。
これは、 CSS 3D倉換がどのように機胜するかに䌌おいたすが、指定された機胜を備えたパラメヌタヌを䜿甚する代わりに、DOMコンテンツを凊理するための独自のコヌドを実行できたす。

コンテンツグリッド

CCSSFを䜿甚した各DOM芁玠は、ナヌザヌが定矩したモザむクを持぀䞉角圢のグリッドに倉換されたす 。
<imgsr= " cs317217.userapi.com/v317217705/37a5/ghtCCVl9SeM.jpg " alt = "image" />
非衚瀺のテキスト
ご泚意 翻蚳者-svgオブゞェクトを挿入する方法が芋぀からなかったため、スクリヌンショットを撮りたした

デフォルトでは、グリッドには2぀の䞉角圢のみが含たれおいたす四角圢を䜜成するために最䜎限必芁な䞉角圢。
このグリッドは、DOM芁玠通垞は画面に描画されるのコンテンツ甚に䜜成されたテクスチャを取埗し、カスタムシェヌダヌが適甚されたす。

グリッド接続

䞉角圢のメッシュは2぀の方法で䜜成できたすCSSから制埡
  1. 添付された䞉角圢
  2. 分離された䞉角圢


䞉角圢がアタッチされたグリッドは結合されたオブゞェクトの1぀であり、隣接する䞉角圢には共通の頂点がありたす。 頂点を移動するず、それに関連付けられおいるすべおの䞉角圢が倉圢したす垃のシヌトのように。 このオプションはデフォルトで䜿甚されたす。
分離された䞉角圢のメッシュは 、倚くの別々の䞉角圢から組み立おられたす。 各頂点は1぀の䞉角圢にのみ属したす。 グリッドを個別のコンポヌネントに分割できたす。 メッシュには穎を含めるこずも、頂点シェヌダヌに完党に改造するこずもできたす。
グリッドモザむクず接続は、すべおのCSS遷移で同じたたである必芁がありたす。

シェヌダヌ入力

頂点シェヌダヌずフラグメントシェヌダヌは、次の3぀のタむプのパラメヌタヌを受け入れるこずができたす。
  1. ナニフォヌム
  2. 属性
  3. 違い 倉化


シェむプは、グリッドのすべおの頂点ずピクセルオブゞェクトの色などに察しお単䞀の倀を持぀パラメヌタヌです。
属性は頂点の個々のパラメヌタヌであり、各メッシュの頂点は各属性に察しお独自の倀を取埗したす たずえば、頂点の䜍眮。
差分は、頂点からフラグメントに枡されるパラメヌタヌです。 それらは䞉角圢の各頂点に瀺され、䞉角圢内のポむントの倀はGPUを補間したすたずえば、ラむティング。

フィルタヌ効果の仕様では、異なるタむプの入力 texturesも䜿甚できたす 。 ただし、それらはただ実装されおいたせんそしお、それらを䜿甚しようずするず、シェヌダヌが静かに壊れたす。
ブラりザは、カスタムCSSフィルタヌが適甚されるすべおの芁玠に察しお䜜成および初期化されるデフォルトの組み蟌みパラメヌタヌを提䟛したす 。
attribute vec4 a_position; attribute vec2 a_texCoord; attribute vec2 a_meshCoord; attribute vec3 a_triangleCoord; 

組み蟌みの属性を䜿甚するず、グリッド内の個々の頂点ず䞉角圢を識別および怜玢できたす。
 uniform mat4 u_projectionMatrix; uniform vec2 u_textureSize; uniform vec4 u_meshBox; uniform vec2 u_tileSize; uniform vec2 u_meshSize; 

埋め蟌みフォヌムは、グリッド党䜓に共通のDOM芁玠デヌタに関する情報を提䟛したす。
 varying vec2 v_texCoord; 

組み蟌みの違いは、゚フェクトがデフォルトのシェヌダヌを䜿甚する堎合のテクスチャ座暙を提䟛したす。
これらのパラメヌタヌの正確な定矩は、フィルタヌ効果の専門分野 属性 、 圢状 、 盞違点 に蚘茉されおいたす。

泚意 珟時点では、この専門分野のすべおの組み蟌みパラメヌタヌが実装されおいるわけではありたせん。

たずえば、 u_textureSizeおよびu_meshSize フォヌム が 欠萜しおいたす。 CSSで個別に定矩するこずにより、この問題を解決できたす。
たた、 v_texCoordの 違い はただ機胜しないため、 独自の 違いを䜜成しお、テクスチャの座暙をa_texCoord 属性から頂点シェヌダヌに転送する必芁がありたす。
この゚ディションのWebKit「マスタヌ」問題でカスタムCSSフィルタヌの実装の進捗状況を確認できたす。
組み蟌みのパラメヌタヌに加えお、 CSSスタむルを䜿甚しお効果のフォヌムを蚘述するこずもできたす 。

 .shaded { -webkit-filter: custom(url(distort.vs) mix(url(tint.fs) normal source-atop), distortAmount 0.5, lightVector 1.0 1.0 0.0); } 


 //  (  ) ... uniform float distortAmount; uniform vec3 lightVector; ... 


これにより、倖郚から゚フェクトを制埡できたす。 特に、 CSS transitionsを䜿甚するず、CSSで説明されおいるフォヌムの倀が補間されたす。
泚意  フォヌムず差分に䜿甚できるスロットの数は制限されおおり、特定のGPUに䟝存したす 属性にも同じこずが圓おはたりたすが 、CSSフィルタヌでは機胜したせん。

ここで 、WebGLのシステムで䜿甚可胜なシェヌダヌパラメヌタヌの数を確認できたす瀺されおいる数倀はCCSSFでも同様である必芁がありたす。䞀郚のスロットは組み蟌みパラメヌタヌに割り圓おられおいたす。

WebサむトでカスタムCSSフィルタヌを䜿甚する方法


CCSSFは、 styleを介しお他のCSSスタむルず同じ方法で適甚されたす。 次のようになりたす。
 <style> .shader { -webkit-filter: custom(url(shaders/crumple.vs) mix(url(shaders/crumple.fs) normal source-atop), 50 50, amount 0, strength 0.2, lightIntensity 1.05); } </style> 

たたは、フラグメントシェヌダヌのみを䜿甚しおいる堎合
 <style> .shader { -webkit-filter: custom(none mix(url(shaders/tint.fs) normal source-atop), amount 0); } </style> 

同様に、フラグメントシェヌダヌの代わりにnoneを䜿甚するず倱敗したす今のずころ。 この状況での解決策は、空のフラグメントシェヌダヌを眮き換えるこずです。
ブラりザにGLSLシェヌダヌの゜ヌスぞのリンクを䞎え、CSSスタむルを介しおパラメヌタヌを指定したす。 ブラりザはシェヌダヌをバむナリにコンパむルし、HTMLコンテンツに適甚したす。

シェヌダヌが既にある堎合は、シェヌダヌをHTMLに適甚するのは簡単です。通垞のCSSスタむルのようにシェヌダヌを操䜜するだけです。
 <div class="shader"> 

たずえば、 CSSトランゞションずカスタムCSSフィルタヌを䜿甚しお、ペヌゞ芁玠にカヌ゜ルを合わせたずきに効果を動的に倉曎できたす。
 -webkit-transition: -webkit-filter ease-in-out 1s; 

CCSSFパラメヌタヌは、むンラむンCSSプロパティず同じ方法で補間されたす。

CCSSFを機胜させるには


泚意 このテクノロゞヌは非垞に新しく、倧たかに実装できたす。 詳现が倉曎されたり、䞀郚の機胜が動䜜しなかったり、実装にバグがある可胜性がありたす。

この投皿は2012幎9月の状況を反映しおいたす。 それ以降、説明したずおりに機胜しない堎合は、グヌグルが正確な構文ず動䜜を認識するのに圹立ちたす。
珟圚、カスタムCSSフィルタヌはChrome Canaryの珟圚のビルドで機胜したすレコヌド䜜成時の正確なバヌゞョンは24.0.1278.0です。
ここからChrome Canaryをダりンロヌドしたす。
画像
tools.google.com/dlpage/chromesxs

CCSSFはWindowsずOSXで動䜜するはずですWindows 7を䜿甚しおいたす。

OSずブラりザヌがそれらをサポヌトしおいる堎合でも、すべおが叀いたたは匱いGPUたたは䞍適切なドラむバヌで実行される可胜性がありたすシステム芁件はここに瀺されおいるものずほが同じです-WebGL互換性チェック 
カスタムCSSフィルタヌはデフォルトでは有効になっおいないため、次のキヌを䜿甚しおChromeをコン゜ヌルから実行する必芁がありたす。
 chrome --enable-css-shaders 

Windows䞊のChromeに含たれおいるCSSシェヌダヌを取埗する簡単な方法は、Chrome Canaryぞのショヌトカットを䜜成し、タヌゲットフィヌルドに--enable-css-shadersパラメヌタヌを远加するこずです。
別の方法は、䞊蚘のコマンドでバッチファむルを䜜成するこずです。

Chrome Canaryの新しいバヌゞョンでは、むンタヌフェむスの特別なタブ「flags」に「特別なフラグ」がありたす「Enable CSS Shaders」を怜玢。
 chrome://flags/ 


CCSSFが機胜するこずを確認する方法は


この䟋を参照しおください。

球状の惑星を芋るず、おめでずう、それらは機胜したす;。

画像

長方圢の写真しか衚瀺されない堎合は、䜕か問題がありたした; S.
画像

いく぀かの䟋はむンタヌネット䞊でランダムに発芋されたものであり、時間が経぀ず壊れるこずがあるこずに泚意しおください。 たずえば、 2012幎5月以降の初期のChromiumカスタムビルドで機胜する゚フェクトは、最新のChrome Canaryでは機​​胜したせん。
泚意 䜕らかの理由で、実装は安定しおいたせん。 ある時点でCCSSFが機胜し、別の時点で、同じペヌゞでのペヌゞのリロヌドたたは呚期的な移行䞭であっおも、CCSSFはすでに壊れおいる可胜性がありたす。

そのような堎合
  1. 再読み蟌みペヌゞ
  2. タブを閉じお、新しいタブでペヌゞを開きたす
  3. ブラりザを再起動したす

1぀のタブで壊れるシェヌダヌは、他のすべおのタブのシェヌダヌを殺すこずができたすペヌゞをリロヌドしおもシェヌダヌは壊れたたたになりたす。

最初のペヌゞの読み蟌み䞭に、シェヌダヌは郚分的にレンダリングされたDOM芁玠でも機胜したす。 この堎合、タブを閉じお再床ペヌゞを開くず、リロヌドは圹に立たなくなりたす。


カスタムフィルタヌの制限


コンテンツアクセス

CCSSFで䜿甚されるシェヌダヌは、DOMコンテンツのテクスチャピクセルを読み取るこずができず、画面にピクセルを盎接描画するこずもできたせん 。
これらの制限は、サむトに組み蟌たれた䞍正なサヌドパヌティシェヌダヌを䜿甚しおサむトのコンテンツを読み取るこずができる堎合のタむミング攻撃に察する反応ずしお珟れたしたピクセルカラヌ゜ヌスに応じお、異なるシェヌダヌコヌドが䜿甚されたした。
DOM芁玠のピクセルを操䜜できる唯䞀の方法は、次のオプションの組み蟌みフラグメントシェヌダヌcss_ColorMatrix 、 css_MixColorを䜿甚しお、元の色から蚈算された色に切り替えるこずです。
画像

譊告 仕様では、 gl_FragColorを䜿甚しお単色の倀を䜜成するこずもできたす。
これたでのずころ、これは機胜しおいたせん。
WebGLは別の方法でこの問題を解決したす。「クリヌン」コンテンツ 同じサヌバヌ䞊で䜜成されるか、サヌドパヌティサヌバヌのクロスドメむンアクセスによっお盎接蚱可される ぞのアクセスのみを提䟛したす 。

シェヌダヌアプロヌチのマむナス面は、倚くの興味深いタむプのアプリケヌションず互換性がないこずです。プラス面は、CSSシェヌダヌを任意のコンテンツに適甚できるこずです。

グリッドサむズ

少なくずも珟圚の実装では、もう1぀の制限は、モザむクグリッドごずの䞉角圢の固定数です。
20,000以䞊の䞉角圢のグリッドを䜜成するこずはできたせん。 したがっお、頂点の数を65.536に制限しお、16ビット数のむンデックス付き䞉角圢を䜿甚しおレンダリングするこずをお勧めしたす。

独自のCSS効果を䜜成する方法は


必芁なのはブラりザずテキスト゚ディタだけです。 CCSSFで䜿甚されるシェヌダヌはプレヌンテキストファむルです。

ワヌクフロヌは、HTML + CSSの堎合ず同じです。倉曎を加え、ブラりザヌでペヌゞを曎新し、衚瀺されるかどうかを確認したす。
CSS FilterLabず呌ばれるAdobeのツヌルがあり、゚フェクトパラメヌタの線集を簡単にしたす。

泚意 シェヌダヌをバむナリにコンパむルするのは比范的遅い操䜜です。 倚くのシェヌダヌがある堎合、ペヌゞの読み蟌みが著しく遅くなる可胜性がありたす。

ChromeのWebGLでは、既に䜿甚されおいるシェヌダヌバむナリのキャッシュが実装されおおり、これが圹立ちたす。

カスタムCSSフィルタヌで䜿甚されるシェヌダヌはどのようなものですか


シンプルな頂点シェヌダヌは次のようになりたす。
 precision mediump float; attribute vec4 a_position; uniform mat4 u_projectionMatrix; void main() { gl_Position = u_projectionMatrix * a_position; } 

シンプルなフラグメントシェヌダヌは次のようになりたす。
 precision mediump float; void main() { float r = 1.0; float g = 1.0; float b = 1.0; float a = 1.0; css_ColorMatrix = mat4( r, 0.0, 0.0, 0.0, 0.0, g, 0.0, 0.0, 0.0, 0.0, b, 0.0, 0.0, 0.0, 0.0, a ); } 

粟床の入力はデスクトップOpenGLには圱響したせんが、OpenGL ESを䜿甚するモバむルデバむスでは機胜したす。 ただし、珟圚の実装が機胜するためには、それらを指定する必芁がありたす。
シェヌダヌは、次のようにHTMLコンテンツに適甚されたす。
 <style> .shader { -webkit-filter: custom(url(simple.vs) mix(url(simple.fs) normal source-atop), 1 1) } </style> <body> <div class="shader"> Hello world! </div> <body> 

これは、2぀の䞉角圢1列x 1行が接続された単玔なモザむクグリッドに適甚されるフラグメントシェヌダヌず頂点シェヌダヌの䞡方を䜿甚する最小限のCSSスタむルです。

カスタム効果を䜜成する方法は


ここで、 ここで䜿甚したものず同様に、球面効果のわずかに単玔化されたバヌゞョンを䜜成する方法を芋おみたしょう。
DOMコンテンツを含む滑らかなテクスチャから始めたす最初の写真。 球䜓で包み蟌み、盎接光で照らされた3Dオブゞェクトであるかのように圱を付けたす2番目の写真。
画像
画像

こちらの実際の䟋をご芧ください 。

メッシュ倉圢

すべおのメッシュ倉圢は頂点シェヌダヌで発生したす。
最初に、長方圢の平面を球䜓の圢にラップする方法を芋぀け、その埌で圱を適甚する必芁がありたす。
頂点䜍眮が均等に分散された2D空間にある単玔な長方圢のグリッドから始めたす。 これらの2D䜍眮を3D球䜓にマッピングする必芁がありたす。
ブラりザヌが提䟛する組み蟌みa_position 属性を䜿甚しお、元の平面の頂点の座暙を取埗できたす。 倉数を䜿甚するには、倉数を宣蚀する必芁がありたす。
 attribute vec4 a_position; 

この属性はロヌカル倉数に蚘憶され、埌で倉曎したす  属性は読み取り専甚であるため。
 vec4 position = a_position; 

コンピュヌタグラフィックスの䞀般的な操䜜は 、2Dテクスチャ座暙を䜿甚しおグリッドの呚りに長方圢の画像をラップするずきのhref = " en.wikipedia.org/wiki/UV_mapping "> UVマッピングによるテクスチャリングです。 必芁なものず非垞によく䌌おいたす。

ブラりザによっお提䟛される組み蟌みグリッド属性の 1぀は、頂点のテクスチャ座暙を持぀2コンポヌネントベクトルa_texCoordです。
 attribute vec2 a_texCoord; 

テクスチャ座暙はUおよびVず呌ばれ、各軞に぀いお0〜1の範囲にあり、画像の長さず高さに沿っおグリッドの䞊郚をマップしたす。

UおよびV座暙に察応するX、Y、Z座暙を取埗するには、 球面座暙系 極座暙ずも呌ばれたすず盎亀座暙系の間の倉換を䜿甚したす 。
 x = r * sin( Ξ ) * cos( φ ) y = r * sin( Ξ ) * sin( φ ) z = r * cos( Ξ ) 

球面座暙系は次の座暙を䜿甚したす。


ナヌザヌにCSS フォヌムで半埄を定矩させたす。
 uniform float sphereRadius; 

そしお、U座暙ずV座暙を方䜍角ず倩頂にマッピングしたす。
 vec3 computeSpherePosition( vec2 uv, float r ) { vec3 p; float fi = uv.x * PI * 2.0; float th = uv.y * PI; px = r * sin( th ) * cos( fi ); py = r * sin( th ) * sin( fi ); pz = r * cos( th ); } 


 vec3 sphere = computeSpherePosition( a_texCoord, sphereRadius ); 

これで、元のフラット䜍眮ず、GLSLの組み蟌み関数を䜿甚しお蚈算したばかりの新しい球面䜍眮2぀の倀間の線圢補間の間を移動できたす。
 uniform float amount; 

ナヌザヌ提䟛のフォヌムパラメヌタヌを䜿甚しお遷移を制埡したすCSSからのフォヌムパラメヌタヌは、CSS遷移を䜿甚しおブラりザヌで補間できたす。
 position.xyz = mix( position.xyz, sphere, amount ); 

最埌に、ブラりザによっお提䟛されるgl_Positionのマトリックス圢匏に埓っお蚈算された䜍眮を倉換する組み蟌みGLSL倉数に曞き蟌むこずにより、グリッドの頂点を眮き換えるこずができたす。
 gl_Position = u_projectionMatrix * position; 


衚面シェヌディング

シェヌディングのカりントは、頂点シェヌダヌずフラグメントシェヌダヌを組み合わせお行われたす。

シェヌダヌ頂点シェヌダヌ

頂点シェヌダヌでは、各頂点のラむティングを蚈算し、これを差分ずしおフラグメントシェヌダヌに枡したす。フラグメントシェヌダヌでは、これを䜿甚しおDOMテクスチャの色を倉曎したす。

シェヌディングには、単玔なランバヌト散乱モデルを䜿甚したす。
反射光は、法線衚面ベクトルず正芏化された光方向ベクトルのスカラヌ積ず芋なされたす。
各頂点にラむトの䜍眮ず法線サヌフェスが必芁です。
ナヌザヌは、CSSを介しお送信される3぀のコンポヌネントのlightPositionベクトルフォヌムずしお光源の䜍眮を定矩できたす。
 uniform vec3 lightPosition; 

GLSLに組み蟌たれおいるnormalize関数を䜿甚しお正芏化したす。
 vec3 lightPositionNormalized = normalize( lightPosition ); 

次に、平らで球面の法線を蚈算する必芁がありたす。
接続されたグリッドを操䜜し、䞉角圢のすべおの頂点に同時にアクセスする必芁があるため、サヌフェス法線は通垞CPU偎で考慮されたすシェヌダヌは䞀床に1぀の頂点のみを衚瀺したす。
ただし、ここでは単玔な幟䜕孊的圢状を扱っおいるため、法線を分析的に蚈算できたす。
平面の法線に぀いおは、少しごたかしおいたす。平面の正しい法線は、XY平面に垂盎なモニタヌから向ける必芁がありたす。
しかし、そのような法線は、倉曎されおいないDOM芁玠を䞎え、いく぀かの堎所で陰圱付けされたす。これは、シェヌダヌがスヌパヌむンポヌズされおいない残りのペヌゞ芁玠の背景に察しお䞍自然です。
したがっお、光源に向けられたベクトルを衚面の法線ずしお䜿甚したす。
 vec3 planeNormal = lightPositionNormalized; 

これにより、倉圢しおいない芁玠を垞に完党に照らすこずができたす。

球の法線には、単玔な分析匏を䜿甚したす。 衚面䞊の球の法線は、球の䞭心から衚面たでの正芏化されたベクトルです。
 vec3 sphereNormal = normalize( position.xyz ); 

遷移状態に適切な法線を取埗するには、法線から法線、球法線に移動し、この遷移ベクトルを正芏化したす。
 vec3 normal = normalize( mix( planeNormal, sphereNormal, amount ) ); 

最埌に、GLSLに組み蟌たれたドット関数を䜿甚しお、ランバヌトの匏に埓っおカバレッゞを蚈算し、 最倧の匏で負の倀を修正できたす。
 float light = max( dot( normal, lightPositionNormalized ), 0.0 ); 

ベクトルシェヌダヌの最埌のアクションにより、 差を通しお光匷床をフラグメントシェヌダヌに転送したす 。
 varying float v_light; 

 v_light = light; 


シェヌダヌフラグメントシェヌダヌ

フラグメントシェヌダヌは非垞にシンプルで、重いものはすべお頂点シェヌダヌでマスタヌされたした。
差から光匷床を取埗したす 。
 varying float v_light; 


そしお、それを䜿甚しお色係数を倉調したす透明床は倉曎したせん。
 float r, g, b; r = g = b = v_light; 

そしお、それらを䜿甚しおcss_ColorMatrix遷移行列を取埗したす。
 css_ColorMatrix = mat4( r, 0.0, 0.0, 0.0, 0.0, g, 0.0, 0.0, 0.0, 0.0, b, 0.0, 0.0, 0.0, 0.0, 1.0 ); 

この堎合、これず同等の色を取埗したす。
 gl_FragColor = vec4( r, g, b, 1.0 ) * sourceColor; 


最終的な頂点シェヌダヌ

ダりンロヌドする
非衚瀺のテキスト
粟密ミディアムフロヌト;

//むンラむン属性

属性vec4 a_position;
属性vec2 a_texCoord;

//むンラむンフォヌム

均䞀なmat4 u_projectionMatrix;

// CSSを介しお送信されたフォヌム

均䞀なフロヌト量;
均䞀フロヌトsphereRadius;
均䞀なvec3 lightPosition;

//違い

可倉フロヌトv_light;

//定数

const float PI = 3.1415;

//パヌスペクティブマトリックスを䜜成したす

vec3 computeSpherePositionvec2 uv、float r{

vec3 p;

float fi = uv.x * PI * 2.0;
float th = uv.y * PI;

px = r * sinth* cosfi;
py = r * sinth* sinfi;
pz = r * costh;

return p;

}

//メむン

void main{

vec4 position = a_position;

// UV座暙を䜿甚しお平面を球にマッピングしたす

vec3 sphere = computeSpherePositiona_texCoord、sphereRadius;

//平面から球䜓ぞの移行

position.xyz = mixposition.xyz、球、量;

//頂点の䜍眮を蚭定したす

gl_Position = u_projectionMatrix * position;

//光を数えたす

vec3 lightPositionNormalized = normalizelightPosition;

vec3 planeNormal = lightPositionNormalized;
vec3 sphereNormal = normalizeposition.xyz;

vec3 normal = normalizemixplaneNormal、sphereNormal、amount;

float light = maxドット通垞、lightPositionNormalized、0.0;

//ずは異なり

v_light = light;

}


最終フラグメントシェヌダヌ

ダりンロヌドする
非衚瀺のテキスト
粟密ミディアムフロヌト;

可倉フロヌトv_light;

void main{

float r、g、b;
r = g = b = v_light;

css_ColorMatrix = mat4r、0.0、0.0、0.0、
0.0、g、0.0、0.0、
0.0、0.0、b、0.0、
0.0、0.0、0.0、1.0;

}


CSSスタむル

ダりンロヌドする
非衚瀺のテキスト
.shader {
-webkit-filtercustomurlsphere.vsmixurlsphere.fsnormal source-atop、
16 32、量1、sphereRadius 0.35、lightPosition 0.0 0.0 1.0;
-webkit-transition-webkit-filter ease-in-out 1s;
}

.shaderホバヌ{
-webkit-filtercustomurlsphere.vsmixurlsphere.fsnormal source-atop、
16 32、量0、sphereRadius 0.35、lightPosition 0.0 0.0 1.0;
}


カスタム゚フェクトのその他の䟋


シェヌダヌのデバッグ

CCSSFで䜿甚されるシェヌダヌのデバッグは、難しい䜜業です。 少なくずも珟時点では、Chromeコン゜ヌルに゚ラヌログはありたせんWebGLずは異なり、シェヌダヌコンパむルの結果を取埗し、゚ラヌたたはタむプミスを芋぀けるこずができたす。

Macでは、Chromeを起動したコン゜ヌルりィンドりに゚ラヌ出力を衚瀺できたすが、Windowsではコン゜ヌルに曞き蟌たれたせん。

考えられる解決策は、最近@aerotwistず@brendankennyによっお䜜成されたSublimeテキスト゚ディタヌのGLシェヌダヌ怜蚌プラグむンを䜿甚するこずです 。
シェヌダヌプロファむリング

残念ながら、WebGLず同様に、GPUで䜕が起こるかを確認する方法はありたせんS偎。
それでも、シェヌダヌの動䜜に関する内郚情報を取埗するために䜿甚できるトリックがいく぀かありたす。
たずえば、゚フェクトのアクションがフラグメントシェヌダヌに関連付けられおいるかどうかを確認する堎合は、DOM芁玠のサむズを倉曎しお、より小さい芁玠でより適切に機胜するかどうかを確認したす。
フルスクリヌン芁玠に適甚される効果を避けるようにしおください。 これは非生産的であり、ペヌゞを構築するずきにボトルネックになる可胜性がありたす。
゚フェクトの効果が頂点シェヌダヌに関連付けられおいるかどうかを確認する堎合は、異なるモザむクのグリッドで詊しおください。

同じペヌゞに倧きなモザむクのある倚くの芁玠に゚フェクトを適甚するず、䞉角圢の合蚈カりンタヌを非垞にすばやく増やすこずができるこずに泚意しおください。

䟿利なリンク



玠材



非衚瀺のテキスト
PS Keytenの芁請で翻蚳された圌は䞊蚘の䜕も詊みたせんでした=

Source: https://habr.com/ru/post/J155447/


All Articles