2011-07-14 14 views
4

現在、次のコードを使用して図形を描画しています。OpenGL ESを使用したグラディエント塗りつぶし

GLfloat vertex = // vertex points 

glLineWidth(2); 

glEnableClientState(GL_VERTEX_ARRAY); 
glColor4f(1.0, 0.0, 0.0, 1.0); 
glVertexPointer(2, GL_FLOAT, 0, vertex); 
glDrawArrays(GL_LINE_STRIP, 0, vertex_size); 
glDisableClientState(GL_VERTEX_ARRAY); 

私が描く形状自体を閉じて、それが(ラジアル)勾配で、この形状を充填することができますか?もしそうなら、これをどうやって行うのですか?

答えて

12

ES 1.xを使用している場合、ピクセルごとに放射状グラデーションを計算することはできません。これは、色が面全体に直線的に補間されるためです。ラジアルグラデーションテクスチャをアップロードするか、適切なジオメトリを作成してラジアルグラデーションに近似させることができます。

ES 2.xでは、ピクセル単位で何が起こるかを定義しているため、このような制限はありません。非常にナイーブ放射状グラデーションフラグメントシェーダは、(徹底的にチェック文法ではない、即座にコード化)されることがあります。

varying mediump vec3 myPosition; 
uniform mediump vec3 referencePosition; 
uniform lowp vec4 centreColour, outerColour; 

[...] 

mediump float distanceFromReferencePoint = 
         clamp(distance(myPosition, referencePosition), 0.0, 1.0); 

gl_FragColor = mix(centreColour, outerColour, distanceFromReferencePoint); 
+2

しかし、 '距離(myPosition、基準位置)'でなければならないこと。 –

+0

@ClassStackerあなたは100%正しいです - 私は私の答えを修正します。 – Tommy

+0

@ Tommy私は断片シェイダーをまだ使用していません。これをさらに完全な例に展開する可能性はありますか? – drewish

関連する問題