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

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

新規登録して質問してみよう
ただいま回答率
85.48%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

GLSL

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

Q&A

解決済

1回答

2255閲覧

こちらのシェーダーが、どのように動作しているのか解りません

seri

総合スコア422

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

GLSL

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

0グッド

0クリップ

投稿2016/04/18 00:16

編集2016/04/18 00:19

GLSL

1#ifdef GL_ES 2precision mediump float; 3#endif 4 5#extension GL_OES_standard_derivatives : enable 6 7uniform float time; 8uniform vec2 mouse; 9uniform vec2 resolution; 10 11void main( void ) { 12 13 vec2 position = ( gl_FragCoord.xy / resolution.xy )*2.0-1.0; 14 15 vec2 p = position; 16 float theta = atan(p.y / p.x); 17 float color = floor(mod(theta,2.)); 18 19 gl_FragColor = vec4(0, 0, color ,1.0 ); 20 21}

このシェーダーをGLSLSandBox(http://glslsandbox.com/e)にまるまるコピペすると解るのですが、チェック柄のような青と黒のシェーダーとなります(知らない人のシェーダーを改造したものなので、SandBoxに投稿していいのか解らず、お手数ですが自身でSandBoxに入力お願いします)
ここで、変数thetaは角度だと思うのですが、仮に9度の位置のpositionを取ったとします。
式どうりに計算すると

theta=9; color= mod:9÷2の余りなので1 floor:1の小数点切り捨てで1。よってcolor=1 となると、青色が出力されると思うのですが、画面中央から右上(9度)の部分は黒となっています 計算間違えだと思うのですが、どこで間違っているのか解りません。。。

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

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

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

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

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

guest

回答1

0

ベストアンサー

一つ確実に言えるのは、thetaは「9度」という度数法ではなく、**弧度法(ラジアン)**というルールで表現されたものです。弧度法は、その角度の中心角を持った半径1の扇形の弧の長さで定義されます。このため、半円(180度)がπラジアンという事になります。
一般に度数法の度を弧度法のラジアンに直す際には、度数×(π/180)という計算をします。これに則ると9度はπ/20≒0.157ラジアンとなります。
ただpositionの計算の意味が私にはわからないため、なぜこれで
イメージ説明
こうなるのかはちょっと説明できません。すみません。

投稿2016/04/18 00:50

swordone

総合スコア20651

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

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

seri

2016/04/18 00:54

回答ありがとうございます。 画像まで添付していただきありがたいです。ありがとうございます! なるほど、、ラジアンに変換するのですね、、てっきり度をそのまま掛けたり割ったりしているのかと解釈しておりました! 助かりました、ありがとうございます!
swordone

2016/04/18 01:18 編集

「変換する」と言うよりは、atanの計算結果がラジアンで出るという方が正確でしょうか。ラジアンは扇型の半径と弧の長さの比を表すのに対し、度数法は人が勝手に「1周を360度」と決めたものなので、数学的な関係性は度数法のほうが薄いのです。
edo_m18

2016/04/18 07:06

ここでの `position` は、画面の座標を `-1.0〜1.0` の間に収める処理をしています。 GLSLでは基本的に `-1.0〜1.0` の間で値をやり取りすることが多いので。 ちなみに `gl_FragCoord.xy` は現在計算中のピクセルの位置(解像度に依存)、 `resolution.xy` は画面解像度の値です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問