1

私は Android API レベル 9 を使用しています。カメラのプレビューを SurfaceView にロードしています。この上にビネット マスクを描画しようとしています。そのために、GLSurfaceView を使用しています。次のフラグメント シェーダー コード (またはピクセル シェーダーですか?) を使用して、XCode シェーダー ビルダーでマスクを準備しました。これは、これまでのところ正常にコンパイルされます。

uniform sampler2D tex;

void main()
{ 
float innerAlpha = 0.0;
float outerAlpha = 1.0;
float len = 1.7;
float startAdjustment = -0.2;
float diff = 0.4;
float alphaStep = outerAlpha / len;
vec2 center = vec2(0.5, 0.5);
vec2 foc1 = vec2(diff,0.);
vec2 foc2 = vec2(-diff,0.);
float r = distance(center+foc1,gl_TexCoord[0].xy) + distance(center+foc2,gl_TexCoord[0].xy);
float alpha = r  - (diff * 2.0) * alphaStep - startAdjustment;
vec4 vColor = vec4(0.,0.,0., innerAlpha + alpha);
gl_FragColor = vColor;
}

ただし、これを Android のコードに実装する方法がわかりません。基本的に、ビュー全体をカバーし、この種のコード生成テクスチャを適用する長方形を作成する必要があると思います。私は実際のコードを理解することができません。理想的には、OpenGL ES 2.0 にある必要があります。

編集1:

@Tim - ここhttp://developer.android.com/training/graphics/opengl/draw.html とここ http://www.learnopengles.com/android-lesson-one-getting-startedのチュートリアルに従おうとしました/ 三角形の描き方は基本的に理解しています。しかし、長方形を描く方法がわかりません。つまり、実際に2つの三角形を実際に描く必要があるのでしょうか、それとも長方形(または他の複雑な形状)をすぐに定義できますか?テクスチャに関しては、私が見たすべてのチュートリアルで、テクスチャは実際には画像ファイルからロードされていますが、上記のピクセルシェーダーを使用して実際にテクスチャを生成するにはどうすればよいか知りたいです.

4

1 に答える 1

0

その間、楕円形のマスクの描き方という答えを見つけました。

実際の問題は、gl_FragCoord を 0.0 から 1.0 の範囲で考えていたのですが、代わりに実際のピクセルで指定する必要があることです (例: 600.0 x 900.0 など)。

ちょっとした調整 (vec2 を float に変更) で、OpenGL の画面全体に素敵な楕円形のマスクを描くことができました。これが最終的なフラグメント シェーダーです。描画する前に制服を指定する必要があることに注意してください。これを試す場合は、意味のある結果を得るために、uSlope を 0.1 から 2.0 の間のどこかに保つようにしてください。また、この特定のコードでは、uInnerAlpha が uOuterAlpha よりも低くなければならないことに注意してください。典型的なビネットの場合、uInnerAlpha は 0.0 で、uOuterAlpha は 1.0 です。

precision mediump float;

uniform float uWidth;
uniform float uHeight;
uniform float uSlope;
uniform float uStartAdjustment;
uniform float uEllipseLength;
uniform float uInnerAlpha;
uniform float uOuterAlpha;

void main() {

float gradientLength = uHeight * uSlope;
float alphaStep = uOuterAlpha / gradientLength;
float x1 = (uWidth / 2.0);
float y1 = (uHeight / 2.0) - uEllipseLength;
float x2 = (uWidth / 2.0);
float y2 = (uHeight / 2.0) + uEllipseLength;

float dist1 = sqrt(pow(abs(gl_FragCoord.x - x1), 2.0) + pow(abs(gl_FragCoord.y - y1), 2.0));
float dist2 = sqrt(pow(abs(gl_FragCoord.x - x2), 2.0) + pow(abs(gl_FragCoord.y - y2), 2.0));
float dist = (dist1 + dist2);

float alpha = ((dist - (uEllipseLength * 2.0)) * alphaStep - uStartAdjustment) + uInnerAlpha;
if (alpha > uOuterAlpha) {
    alpha = uOuterAlpha;
}
if (alpha < uInnerAlpha) {
    alpha = uInnerAlpha;
}

vec4 newColor = vec4(1.0, 1.0, 1.0, alpha);

gl_FragColor = newColor;

}
于 2012-09-26T10:53:20.210 に答える