質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
GLSL

GLSL (OpenGL Shading Language) はC言語をベースとしたシェーディング言語です。

Q&A

解決済

1回答

1443閲覧

GLSLの構文がわからない

退会済みユーザー

退会済みユーザー

総合スコア0

GLSL

GLSL (OpenGL Shading Language) はC言語をベースとしたシェーディング言語です。

0グッド

0クリップ

投稿2021/11/14 01:20

https://takap-tech.com/entry/2019/09/14/003915
こちらのサイトに記載されている
pattern_trans_alpha.fragのフラグメントシェーダ―が分かりません
【1】texture2D(CC_Texture0, v_texCoord)が返す値は
あるテクスチャのある座標の色を示すvec4型という認識で良いですか?
【2】1の説が正しい場合v_fragmentColor * texture2D(**);
vec4型変数
vec4型変数というのはどうやって計算しますか?
【3】color.xというのは0.0f1.0fまでの値ですか?
【4】u_stlengthを0.5、u_percentを0、color.xを0.5とした場合
1.0 - (((u_percent / color.x) - u_stlength) * a))
は2.0になるのですが
gl_FragColor の 各成分の値は
0.0f
1.0fの範囲に収まっていなくても良いのですか?

以下コードです

GLSL

1varying vec4 v_fragmentColor; 2varying vec2 v_texCoord; 3uniform float u_percent; 4uniform float u_stlength; 5void main(void) 6{ 7 vec4 color = v_fragmentColor * texture2D(CC_Texture0, v_texCoord); 8 float a = 1.0 / u_stlength; 9 gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0 - (((u_percent / color.x) - u_stlength) * a)); 10 } 11);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

それ程 GLSL に詳しいわけでは無いので、誤った情報が含まれている可能性がありますの留意ください。

【1】texture2D(CC_Texture0, v_texCoord)が返す値は
あるテクスチャのある座標の色を示すvec4型という認識で良いですか?

はい。そうです。

【2】1の説が正しい場合v_fragmentColor * texture2D(**);
vec4型変数
vec4型変数というのはどうやって計算しますか?

成分ごとの掛け算になります。

glsl

1vec3 a = vec3(1.0, 2.0, 3.0); 2vec3 b = vec3(0.1, 0.2, 0.3);

の場合、

glsl

1vec3 c = a * b; // = vec3(0.1, 0.4, 0.9)

のようになります。

<参考>
■ GLSL Programming/Vector and Matrix Operations - Wikibooks
https://en.wikibooks.org/wiki/GLSL_Programming/Vector_and_Matrix_Operations

【3】color.xというのは0.0f~1.0fまでの値ですか?

通常(※)は0.0f~1.0fの認識で問題ないと思います。

※ このあたり、余り詳しくないのですが、glTexImage2Dinternalformat の指定を変えることで 異なる範囲の指定も行えるようです。
■ Fragment shader output range: Can fragment shader output be out [0.0, 1.0]?
https://community.khronos.org/t/fragment-shader-output-range-can-fragment-shader-output-be-out-0-0-1-0/67787/2

【4】u_stlengthを0.5、u_percentを0、color.xを0.5とした場合
1.0 - (((u_percent / color.x) - u_stlength) * a))
は2.0になるのですが
gl_FragColor の 各成分の値は
0.0f~1.0fの範囲に収まっていなくても良いのですか?

通常は、0.0f~1.0fの範囲ですが、例えば5.0 等を指定しても1.0に丸められる為、動作上は問題ないようです。

投稿2021/11/14 10:33

cx20

総合スコア4648

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/11/15 08:09

回答ありがとうございます 確認ですが【4】について 負の値になったときは0に丸められますか?
fana

2021/11/15 08:48

> 【3】color.xというのは0.0f~1.0fまでの値ですか? color というやつは勝手に用意したvec4であり,その値も > vec4 color = v_fragmentColor * texture2D(CC_Texture0, v_texCoord); の結果ですから,その値域に関しては「知らんがな」なのでは: texture2Dの仕様(?)とは無関係に v_fragmentColor の値次第の値次第になるのでは.
退会済みユーザー

退会済みユーザー

2021/11/15 10:51

バーテックスシェーダーでの v_fragmentColor = a_color; a_colorはcocos2d-xが用意したビルトイン変数でここもあまり理解していません 調べていたら http://brbranch.jp/blog/201607/cocos2d-x/shader/ 「RGB(255,255,255)が画像本来の色」と書いてあったのですが関係ありますか?
cx20

2021/11/15 11:57

fana さん>  補足ありがとうございます。  > v_fragmentColor の値次第の値次第になるのでは  そうですね。v_fragmentColorが -1.0~1.0 だったりすると、color にもマイナスが入る可能性はありそうっですね。 hinhasu さん> > 負の値になったときは0に丸められますか?  そのようです。下記に説明がありました。(WebGLの解説ですが恐らく同様かと思います。)  ■ GLSL だけでレンダリングする  https://wgld.org/d/glsl/g001.html  > マイナスの値を色として代入しても特に問題はありませんし、単に 0.0 と同様に扱われるだけです。 > a_colorはcocos2d-xが用意したビルトイン変数  cocos2d-x の仕様は確認していませんが、一般的にに a_color は頂点色(頂点データに対応する色)かと思います。頂点色の0~255→0.0~1.0に変換されるか否かは、glVertexAttribPointer() の type と normalize の指定によるみたいですね。  例えば type が UNSIGHNED_BYTE で normalize が true の場合、正規化されて 0~255→0.0~1.0 に変換されるようです。(cocos2d-x がどのように取り扱っているのかは確認していません。悪しからず。。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問