タイトル: クリエイター シェーダー レコード
カテゴリ: Cocos2dx
タグ: [クリエイター, シェーダー, レンダリング]
日付: 2023-03-29 21:16:51
コメント: false
mathjax: true
toc: true
クリエイターとシェーダーの記録
前編
- 正式
- シェーダーの作成と使用 - https://docs.cocos.com/creator/manual/zh/shader/effect-inspector.html
- シェーダー構文 - https://docs.cocos.com/creator/manual/zh/shader/effect-syntax.html
- 2D スプライト シェーダー: グラデーション - https://docs.cocos.com/creator/manual/zh/shader/write-effect-2d-sprite-gradient.html
- マクロの使用範囲 - https://docs.cocos.com/creator/manual/zh/shader/macros.html#%E5%AE%8F%E7%9A%84%E4%BD%BF%E7%94% A8 %E8%8C%83%E5%9B%B4
- Cocos Shader ビルトイン グローバル ユニフォーム - https://docs.cocos.com/creator/manual/zh/shader/uniform.html
- Shader で完璧な Wave を書く - https://forum.cocos.org/t/topic/97927
シェーダとマテリアルを動的にロードする
- マテリアルのプログラムによる使用 - https://docs.cocos.com/creator/manual/zh/material-system/material-script.html
パラメータを動的に設定する
- オプションの構成パラメーターを渡す - https://docs.cocos.com/creator/manual/zh/shader/pass-parameter-list.html
マクロを有効にしてパラメータを公開する
-
マクロの使用範囲 - https://docs.cocos.com/creator/manual/zh/shader/macros.html#%E5%AE%8F%E7%9A%84%E4%BD%BF%E7%94% A8 %E8%8C%83%E5%9B%B4
-
editor.parent を通じて対応するマクロを指定すると、このプロパティはマクロが有効な場合にのみ表示されます。
properties: alphaThreshold: { value: 0.5, target: colorScaleAndCutoff.w, editor: { parent: USE_ALPHA_TEST } }
入出力変数の定義
あれは
-
頂点シェーダ
CCProgram sprite-vs %{ // application -> vertex in vec3 a_position; in vec2 a_texCoord; in vec4 a_color; // vertex -> fragment out vec4 color; out vec2 uv0; out vec2 uv1; vec4 vert () { vec4 pos = vec4(a_position, 1); pos = cc_matViewProj * pos; return pos; // 返回剪裁空间下的坐标 } }%
-
ピクセルシェーダ
CCProgram sprite-fs %{ // vertex -> fragment, 需要和像素着色器一致 in vec4 color; in vec2 uv0; in vec2 uv1; vec4 frag () { vec4 mainVal = CCSampleWithAlphaSeparated(mainTexture, vec2(uv0.x + speed, uv0.y)); return mainVal; // 最终显示的颜色 } }%
単位形式変数の定義
-
パラメータをエディタに公開する必要がある場合は、プロパティにパラメータを記述します
CCEffect %{ properties: mainTexture: { value: grey } mainTilingOffset: { value: [1, 1, 0, 0] } colorB: { value: [0.2432, 0.2432, 0.2432, 1.0], editor: { type: color, tooltip: '颜色' } } colorC : { valu: [0.1, 0.0]} mask01Uspeed : { { valu: 1.0}, editor: { parent: 'MASK01', displayName: 'Uspeed' } } mask01Vspeed : { { valu: 1.0}, editor: { parent: 'MASK01', displayName: 'Vspeed' } } }%
-
ピクセル シェーダでは、定数
CCProgram sprite-fs %{ uniform Constant { vec4 colorB; vec2 colorC; float mask01Uspeed; float mask01Vspeed; }; }%
- unique の定義順序はバイト アラインメントの原則に従う必要があり、大きい方が先頭に、小さい方が最後に配置されます。そうでない場合は、エラーが報告されます。
Error EFX2205: UBO 'Constant' introduces implicit padding: 8 bytes before 'xxx', consider re-ordering the members
- unique の定義順序はバイト アラインメントの原則に従う必要があり、大きい方が先頭に、小さい方が最後に配置されます。そうでない場合は、エラーが報告されます。
-
頂点シェーダーでは、すべてTexCoordsに配置されます
CCProgram sprite-vs %{ uniform TexCoords { vec4 mainTilingOffset; float mask01Uspeed; float mask01Vspeed; }; }%
-
エディターの効果
表示パラメータを編集する
-
属性定義
properties: _VSpeed_diffusem : { { value: 0.0}, target: colorScaleAndCutoff.x, editor: { parent: '_DIFFUSEMASK_ON', displayName: 'Vspeed', slide: true, range: [0, 1.0], visible: false, type: 'color', tooltip: '颜色 B' } }
-
value
: はデフォルト値です。0.5, [0.5, 0.5], [0.5, 0.5, 0.5, 0.5]
-
target
: パネル上のこの値をユニットまたはそのコンポーネントにマッピングできます。 -
editor
: エディタの表示設定です-
parent
: コードで使用されるマクロを指定します。チェックすると、エディターでマクロが有効になります。これらのパラメーターが同じ領域に表示されます。 -
slide
: スクロールバーかどうかを示します -
displayName
: 表示名 -
range
: 値の範囲制約 -
visible
: 表示または非表示 -
type: 'color'
: タイプを色として指定します -
tooltip
: ポップアッププロンプト
-
-
色
-
属性定義
properties: colorB: { value: [0.2432, 0.2432, 0.2432, 1.0], editor: { type: color, tooltip: '颜色 B' } }
-
効果
Unity シェーダーラボ コードの実際の翻訳
-
団結
#if _DIFFUSEMASK_ON #if _DIFFUSEMASKRO_ON float DiffuseMaskAng_cos; float DiffuseMaskAng_sin; sincos(0.0174*_DiffuseMaskAng, DiffuseMaskAng_sin, DiffuseMaskAng_cos); //uv旋转前将旋转中心移到uv中心 vec2 panner1=mul(v.texcoord0- vec2(0.5,0.5),half2x2( DiffuseMaskAng_cos, -DiffuseMaskAng_sin, DiffuseMaskAng_sin, DiffuseMaskAng_cos))+ vec2(0.5,0.5)+_Time.y*float2(_USpeed_diffusem, _VSpeed_diffusem); #else float2 panner1=v.texcoord0+_Time.y*float2(_USpeed_diffusem, _VSpeed_diffusem); #endif o.uv0 = TRANSFORM_TEX(panner1, _DiffuseMaskTex); #endif
-
ココス
properties: mainTexture: { value: grey } mainTilingOffset: { value: [1, 1, 0, 0] } _DiffuseMaskAng : { { value: 0.0}, editor: { step: 1, parent: '_DIFFUSEMASK_ON', displayName: '旋转角度'}} _USpeed_diffusem : { { value: 0.0}, editor: { parent: '_DIFFUSEMASK_ON', displayName: 'Uspeed' } } _VSpeed_diffusem : { { value: 0.0}, editor: { parent: '_DIFFUSEMASK_ON', displayName: 'Vspeed' } } uniform TexCoords { vec4 mainTilingOffset; float _DiffuseMaskAng; float _USpeed_diffusem; float _VSpeed_diffusem; }; #if _DIFFUSEMASK_ON #if _DIFFUSEMASKRO_ON float DiffuseMaskAng_cos; float DiffuseMaskAng_sin; DiffuseMaskAng_sin = sin(0.0174*_DiffuseMaskAng); DiffuseMaskAng_cos = cos(0.0174*_DiffuseMaskAng); //uv旋转前将旋转中心移到uv中心 vec2 panner1=(a_texCoord- vec2(0.5,0.5)) * mat2( DiffuseMaskAng_cos, -DiffuseMaskAng_sin, DiffuseMaskAng_sin, DiffuseMaskAng_cos) + vec2(0.5,0.5)+cc_time.y*vec2(_USpeed_diffusem, _VSpeed_diffusem); #else vec2 panner1=a_texCoord+cc_time.y*vec2(_USpeed_diffusem, _VSpeed_diffusem); #endif uv0 = panner1 * mainTilingOffset.xy + mainTilingOffset.zw; #else uv0 = a_texCoord; #endif
- mul は 2 つの行列に直接置き換えることができます*
- float2/half2 は対応する vec2 に置き換えられます。
- Half2x2 を mat2 に置き換える
- sincos は sin と cos の計算に置き換えられます。
ピットを踏む
float 変数は小数点付きの値を定義する必要があります
- 定義されている場合
float aaa= 0;
、エラーが報告されます。cannot convert from 'const int' to 'highp float'
- 正しい使い方は、
float aaa= 0.0;
アニメーション k マテリアル パラメータが有効になりません
- この問題は 3.6.3 エンジンで発生します。
- 解決策はバージョン 3.7.2 以降にアップグレードすることです。このような問題は発生しません。
2D UV サンプル エディタは正常に動作しますが、正しく動作しません
-
カスタム シェーダにテクスチャを追加し、UV を使用してサンプリングしたところ、エディタでは正常にサンプリングされているが、実行時にはサンプリングが正常ではないことがわかりました。
-
その理由は次のとおりです。エディタにインポートされたテクスチャがスプライト タイプに設定されている場合、Packable はデフォルトで自動的にチェックされます。つまり、画像は実行時に大きな画像にマージされ、変更された画像の UV が(0 または 1) ではなく 0.x になるため、この UV 値を使用してカスタム テクスチャをサンプリングすると、正しい結果が得られません。
-
解決策には2つのケースがあります
- スプライト テクスチャのサンプリング値を使用する必要がある場合は、 Packable にチェックを入れるだけで、自動的に大きな画像に結合されません。
- スプライト テクスチャを使用する必要がない場合は、小さな役に立たないテクスチャを作成し、Packableにチェックを入れることができます。
-
公式ウェブサイトの説明を参照してください。
https://docs.cocos.com/creator/manual/zh/asset/sprite-frame.html#packable
Packable
エンジンが動的イメージ結合機能を有効にしている場合、動的イメージ結合により、シーンの先頭で適切なテクスチャが大きなイメージに自動的にマージされ、ドローコールが削減されます。ただし、テクスチャをより大きな画像にマージすると、元のテクスチャの UV 座標が変更されます。テクスチャの UV 座標がカスタム エフェクトで使用されている場合、エフェクトの UV 計算が正しくなくなります。Packable を設定する必要があります。テクスチャのプロパティを false に設定します。テクスチャがダイナミック コンポジットにパックされるのを避けます。
エディターの開発は正常に実行されますが、パッケージ化後は正常に実行されません
- 読み込みエラー:
Failed to load resource: the server responded with a status of 404 (Not Found)
- 理由は依然としてPackableの問題です。つまり、シェーダーで使用されるテクスチャの Packable がチェックされていて、このエラーが発生しました。
- 解決策: シェーダーでテクスチャが使用されている場合、Packable をチェックすることはできません。コピーをコピーして、テクスチャタイプのテクスチャに変更する必要があります。