Android Vuforia AR播放透明視頻

日常記錄

代碼

Android Studio項目

重要的一部分

VideoPlaybackShaders類中使用以下代碼替換

VIDEO_PLAYBACK_FRAGMENT_SHADER

public static final String VIDEO_PLAYBACK_FRAGMENT_SHADER =
“#extension GL_OES_EGL_image_external:require \ n”+
“精確介質浮動; \ n”+
“uniform samplerExternalOES texSamplerOES; \ n”+
“改變vec2 texCoord; \ n”+
“改變vec2 texdim0; \ n”+
“void main()\ n \ n”+
“{\ n”+
“vec3 keying_color = vec3(0.647,0.941,0.29); \ n”+
“float thresh = 0.45; // [0,1.732] \ n”+
“float slope = 0.1; // [0,1] \ n”+
“vec3 input_color = texture2D(texSamplerOES,texCoord).rgb; \ n”+
“float d = abs(length(abs(keying_color.rgb - input_color.rgb))); \ n ”+
“float edge0 = thresh *(1.0  -  slope); \ n”+
“float alpha = smoothstep(edge0,thresh,d); \ n”+
“gl_FragColor = vec4(input_color,alpha); \ n”+
“}”;

keying_color變量中存儲了我們要替換的實際顏色。它使用經典的RGB​​模型,但強度不表示爲0-255整數。它是0-1範圍內的浮點值。(所以0 = 0,255 = 0,122 = 0.478 ...)在我們的例子中,綠色有值(0.647,0.941,0.29),但如果你使用不同的視頻,自己測量顏色。

注意:確保您的顏色正確。某些顏色測量軟件會自動將顏色轉換爲稍微不同的格式,例如AdobeRGB。

所以,我們完成了,對吧?不。

有一個重要部分來了!!

在VideoPlaybackRenderer類中

(說明

要啓用透明度,您還需要啓用混合。如果沒有混合,每次編寫新的像素顏色值(透明與否)時,舊的像素顏色值都會被刪除。所以你可以獲得很好的視頻播放效果,但是會破壞它背後的攝像頭圖像。

要啓用混合,請在這兩個glUseProgram調用中的每一個之前將以下兩行代碼插入到類renderFrame方法中:

GLES20.glUseProgram(keyframeShaderID);
GLES20.glUseProgram(videoPlaybackShaderID);.

要插入的代碼:

GLES20.glEnable(GLES20.GL_BLEND);
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA,GLES20.GL_ONE_MINUS_SRC_ALPHA);

 

第一個glUseProgram調用負責渲染png視頻預覽。因此,如果您不在png文件中使用透明度,則可以跳過它。渲染實際視頻時使用第二個調用。

關於你必須插入的那兩行:它們啓用混合並將其設置爲根據其alpha值混合像素。因此像素的顏色不受影響,只有alpha值很重要。

這下完成了把?嘻嘻還沒有

在大多數設備上,這樣做。但在某些情況下,您仍然會獲得黑色背景而不是相機圖像。那是因爲我們打開了混合,但我們從未關閉它。

要關閉混合,您必須在所有glUseProgram(0)調用後添加此行:

GLES20.glDisable(GLES20.GL_BLEND);//todo在glUseProgram(0)後調用

應該有三個glUseProgram(0)調用,最後一個已經調用了。

sososososo運行起來試試吧!

喜歡的朋友點點關注哦!

一些論壇帖子:

https://developer.vuforia.com/forum/qcar-api/playing-video-alpha-channel-videosample-demo-project

https://developer.vuforia.com/forum/qcar-api/displaying-video-alpha-channel-removed

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章