2012-09-15 95 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; 

}