2016-12-03 12 views
3

私はそれの上に輝く光を持っているように見える円形の粒子を作ろうとしています。OpenGL:フラグメントシェイダーを使用した円ベベル?

は、ここで私はそれが見えるように取得しようとしているものです:

particle 1

そして、ここで、それが現在のようになります。

enter image description here

非常に良いわけではありません。私はGL_POINTSを使用していますので、私はこの混乱につながった、それを適切に使用する方法がわからないを除いて、私は、物事を簡単にする必要がありgl_PointCoord変数を取得

varying lowp vec4 DestinationColor; 

void main(void) { 
    lowp vec2 circCoord = 2.0 * gl_PointCoord - 1.0; 
    if (dot(circCoord, circCoord) > 1.0) { 
    discard; 
    } 
    gl_FragColor = mix(DestinationColor, vec4(1, 0.5, 0.2, 1), (1.0-gl_PointCoord.t)*(max(abs(gl_PointCoord.t-0.5),abs(gl_PointCoord.s-0.5)))); // the world's worst slowest math 
} 

私は考え私は自分のひどい数学スキルのおかげで、誰かが私にこれに少しの助けを与えることができたら非常に感謝しています。

+0

:たとえば、ランバート拡散は次のように動作します。 – pleluron

+0

これはiOS上で実行されている2Dアプリなので、3D計算を避けたいと思っています...より速くもっと速く... – MysteryPancake

答えて

4

適切なフルライティング計算を行うことができます。あなたがフラグメントの通常gl_PointCoordからを計算して、3D雷計算を適用しようとすることができ

const vec3 lightDir = normalize(vec3(0, 1, -0.5)); 
const vec3 ambient = ...; 
const vec3 lightDiffuse = ...; 

vec3 normal = vec3(circCoord, sqrt(1 - dot(circCoord, circCoord))); 
float c = max(dot(normal, lightDir), 0); 
gl_FracColor = ambient + lightDiffuse*c; 
+0

うわー...まさに私が何をしていたのか。一つのことですが、それはトップではなく底にあります。私はlightDirを変更しようとします – MysteryPancake

+0

さて、yを-1に変更することは、私が望むように正確に働いた! – MysteryPancake

+0

もう1つの質問ですが、私は単純な2Dベベルに対しては特に完全なライティング計算は必要ありません。これを私が必要とするものに単純化する方法はありますか?私が欲しいのは、上の小さなグラデーションです.iOSアプリケーションでこれを使用しているので、かなり速くなる必要があります。 – MysteryPancake