テキストシェーダー link
Ren'Py には、Ren'Py がテキストを表示する方法を制御できるテキストシェーダーシステムが含まれています。有効にすると、テキストシェイダー システムは モデルベースのレンダリング を使用して、各文字につき 2 つの三角形をレンダリングします。シェーダーパーツは、開発者から指定されたものか、Ren'Py によって生成されたものかにかかわらず、モデルに適用され、テキストの表示方法を変更できます。
テキストシェーダーのドキュメントは、次の3パートに分けられます :
テキストシェーダーの使い方
Ren'Py に含まれるテキストシェーダー
新しいテキストシェーダーを作成する方法
テキストシェーダーはゲームクリエイターが簡単に使えるように意図されていますが、独自のテキストシェーダーを作るには GLSL つまり OpenGL シェーディング言語と モデルベースのレンダリング の知識が必要で、Ren'Py のほとんどの機能よりも高度です。
テキストシェーダの使用 link
テキストシェーダを使用するには、次の 3 つの方法があります。 :
デフォルトのテキストシェイダー 1つ目は、 config.default_textshader
を使用してデフォルトのテキストシェイダーを設定します
define config.default_textshader = "wave:10"
このように設定すると、テキストシェーダーが指定されていないすべてのテキストにこのテキストシェーダーが使用されます。また、デフォルトのテキストシェイダーを含みテキストシェイダーの組み合わせも使用できます。
一般に、デフォルトのテキストシェーダーはスローテキスト(一文字ずつ表示するテキスト)を処理し、より複雑な効果は追加すべきでありません。
スタイル テキストシェーダーを使う 2 つ目の方法は、 textshader
スタイルプロパティーを直接設定するか、 Ren'Py が提供するスタイル設定方法のうちの 1 つでの設定です。
style default:
textshader "dissolve"
define goldfinger = Character("Goldfinger", what_textshader="linetexture:gold.png")
screen purchase():
vbox:
text "Buy the DLC for more!" textshader "wave"
textbutton "Buy Now":
text_textshader "wave" action iap.Purchase("dlc")
テキストタグ テキストシェーダーを使用する 3 つ目の方法は、 適切な text tag
を使用した、一部のテキストの外観変更です。
"What's this? A letter from {shader=zoom}out of nowhere{/shader}?"
注 テキストブロックは、テキストシェーダーを使用するか使用しないかのどちらかにする必要があり、混合はサポートされていません。例えば、上記のようにテキストタグを使用する場合は、 config.default_textshader
または textshader
スタイルプロパティーを設定する必要があります。
テキストシェーダの指定 link
テキストシェーダーは、次のような文字列として指定されます。
"dissolve"
"jitter:u__jitter=1.0, 3.0"
"texture:gold.png"
文字列の最初の部分 (最初のコロンの前) は、テキストシェイダーの名前です。文字列の残りの部分は、シェーダーに渡される一連の uniform で、コロンで区切られています( uniform はシェーダーに渡されるパラメータで、シェーダーの動作を制御するために使用できます)。
uniform は、名前に続く = で指定するか、各 uniform を順番に設定して名前を省略できます(名前の省略は Ren'Py 7 ではサポートされていません)。内部的には、すべての uniform は u_ で始まりますが、簡潔にするために u_ を省略できます。
uniform の値は次のとおりです。
コンマで区切られた 1 から 4 の間の数字。これらは、 float, vec2, vec3 または vec4 タイプで使用できます。
# で始まる色(例えば、赤の場合は #f00 または #ff0000)。これにより、その色に対応する vec4 が作成されます。この色は、そのアルファチャンネルによって事前に乗算されます。
テクスチャとして使用される displayable です。これがテクスチャのサンプリングに使用できる sampler2D を作成します。
uniform の値を式やアクセス変数にはできませんが、テキスト置換を使用して、テキストシェーダタグまたはそのパラメータとして評価できる文字列を作成できます。
最後に、テキストシェーダーは、| 演算子を使用して互いに組み合わせられます。例えば
"jitter:1.0, 3.0|wave"
これにより、 jitter と wave の両方のシェーダーがテキストに適用されます。これは、シェーダーが互いに互換性があり、同じ uniform を使用しない(または、リストの最後のシェーダーから値を取得して互いに互換性のある方法で uniform を使用する)場合にのみ機能します。
テキストシェーダーの include_default が False に設定されていない限り、デフォルトのテキストシェーダーはスタイルまたはタグで指定されたテキストシェーダーと組み合わせられます。
テキストシェーダーコールバック link
config.textshader_callbacks
変数により、テキストシェーダーが適用されたときに実行されるコールバックを設定できます。これを使用して、設定に基づいてテキストシェーダーをカスタマイズできます。
default persistent.dissolve_text = True
init python:
def get_default_textshader():
if persistent.dissolve_text:
return "dissolve"
else:
return "typewriter"
define config.default_textshader = "default"
define config.textshader_callbacks["default"] = get_default_textshader
組み込みのテキストシェーダ link
Ren'Py には多数の組み込みテキストシェーダーが含まれています。
- dissolve link
dissolve テキストシェーダは、先頭が最初にディゾルブし、末尾が最後にディゾルブするように、テキストをゆっくりとディゾルブして処理します。
- u__duration = 10.0
一度にアルファを変更する文字の数。 0 に設定すると、ディゾルブの波はテキスト上を 1 ピクセルずつ移動します。
このシェーダを使用すると、デフォルトのテキスト シェーダが使用されなくなります。
- flip link
flip シェーダは、テキストを水平方向に反転させて、先頭が最初に反転し、終端が最後に反転するように、スローテキストを反転します。
- u__duration = 10.0
一度に反転する文字の数。 0 に設定すると、文字は即座に反転します。
このシェーダを使用すると、デフォルトのテキスト シェーダが使用されなくなります。
- jitter link
jisster テキストシェーダは、テキストを通常描画される場所を基準にしてランダムな位置に移動します。位置はフレームごとに 1 回変わります。
- u__jitter = (3.0, 3.0)
テキストに適用するジッターの量 (ピクセル単位)。
- linetexture link
テキストにテクスチャを一度に 1 行ずつ乗算します。テクスチャはテキストの左側に揃えられます。テクスチャの垂直方向の中心はテキストのベースラインに揃えられています - つまりテクスチャの下半分のほとんどは見えなくなります
- u__texture = ...
テキストを乗算するテクスチャ。
- u__scale = (1.0, 1.0)
テクスチャをスケールする係数。たとえば、(1.0, 0.5) とすると、テクスチャの高さはそうでない場合の半分になります。
- offset link
offset テキスト シェーダは、テキストを一定の量だけ移動します。
- u__offset = (0.0, 0.0)
テキストを移動する量 (仮想ピクセル単位)。
- slowalpha link
slowalpha シェーダーは、 typewriter や dissolve などの他の低速テキストシェイダーとの併用を意図しています。これにより、まだ表示されていないテキストは非表示にならずに、アルファ値 u__alpha = 0.2 で描画されます。
- u__alpha = 0.2
まだ表示されていないテキストのアルファ値。
- texture link
texture テキストシェーダは、テキストにそのテクスチャーの色を乗算します。これは、アウトライン文字やオフセット文字には適用されません。テクスチャはテキストの左上に揃えられます。
- u__texture = ...
テキストを乗算するテクスチャ。
- typewriter link
typewriter テキストシェーダーは、テキストを一度に 1 文字ずつ表示し、タイプライターで入力しているかのように表示して、低速テキストを処理します。
このシェーダを使用すると、デフォルトのテキスト シェーダが使用されなくなります。
- wave link
wave テキスト シェーダは、テキストを波状に上下に跳ね返らせます。
- u__amplitude = 5.0
テキストが移動する上下のピクセル数。
- u__frequency = 2.0
振動数。
- u__wavelength = 20.0
波のピーク間の文字数。
- zoom link
zoom テキストシェーダは、低速テキストを処理して、初期サイズの u__zoom = 0.0 からフル サイズにズームインします。
- u__zoom = 0.0
文字が最初に表示開始されたときに適用する初期ズーム量。
- u__duration = 10.0
一度に反転する文字の数。 0 に設定すると、文字は即座に反転します。
このシェーダを使用すると、デフォルトのテキスト シェーダが使用されなくなります。
テキストシェーダの作成 link
テキストシェイダーは、 GPU 上で実行される GLSL プログラムです。これらのシェーダーは、関数 renpy.register_text_shader を使用して登録されます。
- renpy.register_textshader(name, shaders=(), extra_slow_time=0.0, extra_slow_duration=0.0, redraw=None, redraw_when_slow=0.0, include_default=True, adjust_function=None, doc=None, **kwargs) link
これにより、テキストシェーダーが作成され、 name という名前で登録されます。
この関数は、次の引数を取ります。
- name
これはテキストシェーダーの名前です。また、 textshader.`name` という名前のシェーダーパーツを登録するためにも使用されます。
- shaders
テキストに適用するシェーダーパーツ。これは、文字列、または文字列のリストまたはタプルです。これは、
renpy.register_shader()
またはこの関数で登録されたシェーダーパーツである必要があります。シェーダーパーツが '-' で始まる場合、それはシェーダーパーツの一覧から削除されます(たとえば、'-textshader.typewriter' はその部分を削除します)。なお、この関数で登録したシェーダーパーツには接頭辞 textshader. が付きますが、この関数で使用する場合は textshader. を指定する必要があります。
- extra_slow_time
Ren'Py が算出する現在の秒間文字数超えた長時間の効果に追加する余分な時間です。これは、文字の遷移に既定の時間よりも時間がかかる可能性があるシェーダーに役立ちます。 True の場合、シェーダーは常に更新されます。
- extra_slow_duration
extra_slow_time に追加されますが、こちらは1文字あたりの時間に乗算して効果時間に追加する時間を所得します{1文字あたりの時間は 1 / (1秒あたりの文字数)です}。
- redraw
すべての低速テキストが表示されて extra_slow_time が経過した後、テキストが再描画されるまでの時間(秒単位)です。
- redraw_when_slow
低速テキストを表示中のそのテキストが再描画されるまでの時間 (秒単位)。
- include_default
True の場合、このテキストシェーダーを直接使用すると、
config.default_textshader
と結合されます。- adjust_function
キーワード引数としてテキストシェーダーに渡されたオブジェクトとユニフォームを引数に呼び出される関数。この関数は、オブジェクトの extra_slow_time, extra_slow_duration, redraw および redraw_when_slow フィールドを設定できます。
- doc
ドキュメント化情報を含む文字列。これは主に Ren'Py のドキュメントシステムを対象としています。
u_
で始まるキーワード引数はユニフォームとしてシェーダに渡され、#
で始まる文字列は色として解釈されます。ほとんどのユニフォームはu__
で始まり、他のシェーダとの衝突を防ぐために shader local variables を使用します。variables という名前のキーワード引数と、 fragment_ または vertex_ で始まるすべてのキーワード引数が
renpy.register_shader()
に渡され、シェーダーパーツが登録されます。
テキストシェーダーの変数 link
テキストシェーダーに提供したユニフォーム (通常は u__
で始まる) に加えて、Ren'Py は以下の変数をテキストシェーダーで利用できるようにします。テキストシェーダーで変数を使用するには、変数を renpy.register_text_shader の variables 引数で宣言する必要があります。
これらに加えて、 model uniforms と attributes が利用可能です、特に a_position, a_tex_coord, u_time, u_random が便利です。
Uniform link
float u_text_depth
上からのテキストの深度。テキストの一番上のレイヤーの深度は 0.0、次のレイヤーの深度は 1.0 というように続きます。
vec2 u_text_offset
文字の中心からのテキストのオフセット。これは、x、y順の描画可能なピクセルです。
float u_text_outline
テキストの周りのアウトラインの幅。これは描画可能なピクセル単位で、テキストの端からアウトラインの端までの距離です。
float u_text_main
これが 1.0 の場合、そのテキストはメインテキストです。これが 0.0 の場合、そのテキストはメインテキストのアウトラインまたは影です。
float u_text_slow_time
低速テキスト効果の開始からの経過時間(秒単位)。これは、低速テキストが完了し、最大になるまで増加します。ユーザーがクリックして低速テキストを終了すると、これは最大になります。低速テキストにのみ使用してください。
float u_text_slow_duration
低速テキストを表示するときの低速テキストの 1 文字の長さ。低速テキストを表示していない場合は 0.0。
float u_text_to_virtual
仮想ピクセルに対する描画可能なピクセルの比率。これにより描画可能ピクセルから仮想ピクセルに変換します。
float u_text_to_drawable
描画可能なピクセルに対する仮想ピクセルの比率。これにより仮想ピクセルから描画可能ピクセルに変換します。
sampler2D tex0
このテクスチャはレンダリングされたテキストを含みます。
vec2 res0
テクスチャの解像度 (描画可能なピクセル単位)。
Attribute link
vec2 a_text_center
頂点のベースラインの中心の位置 (描画可能なピクセル単位)。これは長方形の中心ではなく、ベースライン上、文字の中心の周りの点です。
float a_text_index
描画される文字のインデックス。これは、最初の頂点では 0 で、頂点ごとに 1 ずつ増加します。
vec2 a_text_min_time
文字の頂点を表示するべき最小時間。左から右に表示する場合、これは左端の頂点が表示される時間です。 テキストの即時表示を意図しているが、
u_text_slow_duration
が 0.0 でないとき、これは -3600.0 になります。vec2 a_text_max_time
文字の頂点を表示する最大時間。左から右に表示する場合、これは右端の頂点が表示される時間です。 テキストの即時表示を意図しているが、
u_text_slow_duration
が 0.0 でないとき、これは -3600.0 になります。float a_text_time
この頂点が表示されるべき時間。テキストの即時表示を意図しているが、
u_text_slow_duration
が 0.0 でないとき、これは -3600.0 になります。vec4 a_text_pos_rect
描画される矩形 (描画可能なピクセル単位)。これは、矩形の x、y、幅、高さを描画可能なピクセル単位で表した vec4 です。これを
res0
で割るとテクスチャ座標に変換できます。
例 link
これは、表示時にテキストを回転させるテキストシェーダーの例です。
init python:
def adjust_extra_slow_time(ts, u__delay, **kwargs):
"""
Adjusts a text shader's extra slow time to support the spinning text shader.
"""
ts.extra_slow_time = u__delay
renpy.register_textshader(
"spin",
adjust_function = adjust_extra_slow_time,
variables = """
uniform float u__delay;
uniform float u__offset;
uniform float u_text_slow_time;
attribute vec2 a_text_center;
attribute float a_text_min_time;
""",
vertex_50 = """
float l__angle = clamp((u_text_slow_time - a_text_min_time) / u__delay, 0.0, 1.0) * 2.0 * 3.1415926536;
float l__sin = sin(l__angle);
float l__cos = cos(l__angle);
gl_Position.y -= u__offset;
gl_Position.xy -= a_text_center;
gl_Position = vec4(
gl_Position.x * l__cos - gl_Position.y * l__sin,
gl_Position.x * l__sin + gl_Position.y * l__cos,
gl_Position.z,
gl_Position.w
);
gl_Position.xy += a_text_center;
gl_Position.y += u__offset;
""",
u__delay = 1.0,
u__offset = 0,
)
これは、次のスクリプトで使用できます。
define config.default_textshader = "typewriter"
label start:
"This is a test of the {shader=spin:0.5:-5}spin{/shader} text shader."