2012-09-15 59 views
1

我在Android API级别9.我有装入SurfaceView相机预览。我正试图在这个上画一个小插曲的面具。为了做到这一点,我正在使用GLSurfaceView。我使用下面的片段着色器的代码编写XCode中着色器制造商口罩(或者是像素着色器?),它编译成功至今:Android的OpenGL ES 2.0的暗角面膜

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中。

EDIT1:

@Tim - 我试图按照教程这里http://developer.android.com/training/graphics/opengl/draw.html 这里 http://www.learnopengles.com/android-lesson-one-getting-started/ 我基本上明白了,怎么画一个三角形。但我不明白,如何绘制矩形 - 我的意思是我真的需要绘制两个三角形,或者我可以直接定义矩形(或其他复杂的形状)? 至于纹理 - 在所有的教程我所看到的,纹理实际从图像文件加载,但我有兴趣知道,我怎么能真正那种用上面的像素着色器生成一个。

+0

您是否尝试过以下任何教程,或者您是否有任何OpenGL体验?我认为“我如何在OpenGL中绘制”可能超出了单个问题的范围。或者如果你认为你可能会接近你能展示你的尝试吗? – Tim

+0

*我真的需要实际绘制两个三角形或者我可以只定义矩形*是的,你需要绘制两个三角形,如果你想有一个四。这听起来像你试图做得太快。只要专注于绘制一个普通的彩色四边形,并且一旦理解了基本知识,就可以通过增量步骤添加内容。 – Tim

回答

0

同时,我已经找到了答案,如何画椭圆形面具。

实际上,问题在于,我在考虑gl_FragCoord的范围为0.0到1.0, ,但它们必须以实际像素指定,例如, 600.0 X 900.0等

有了小的调整(改变VEC 2对浮动)我已经能够在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; 

}