我已經爲我的android應用程序編寫了一些着色器代碼。它有一些隨時間變化的動畫,其工作對WebGL的版本完全以細膩,着色器代碼如下,但完全版可以發現功能的here隨着時間的推移,Android opengl es 2.0在着色器中的及時相關操作變得越來越慢
vec3 bip(vec2 uv, vec2 center)
{
vec2 diff = center-uv; //difference between center and start coordinate
float r = length(diff); //vector length
float scale = mod(u_ElapsedTime,2.); //it is equal 1 every 2 seconds and trigerring function
float circle = smoothstep(scale, scale+cirleWidth, r)
* smoothstep(scale+cirleWidth,scale, r)*4.;
return vec3(circle);
}
返回在Fragcolor作爲顏色的基礎。
u_ElapsedTime發送通過統一的着色器:
glUniform1f(uElapsedTime,elapsedTime);
發送從 「onDrawFrame」 着色器實時數據:
public void onDrawFrame(GL10 gl) {
glClear(GL_COLOR_BUFFER_BIT);
elapsedTime = (SystemClock.currentThreadTimeMillis()-startTime)/100f;
//Log.d("KOS","time " + elapsedTime);
scannerProgram.useProgram(); //initialize shader
scannerProgram.setUniforms(resolution,elapsedTime,rotate); //send uniforms to shader
scannerSurface.bindData(scannerProgram); //get attribute location
scannerSurface.draw(); //draw vertices with given attributes
}
所以一切看起來完全以罰款。儘管如此,經過一段時間之後,它看起來像是有一些滯後和幀數從一開始就較少。最後,它可能就像這個功能每個cicle只有一個兩幀。與此同時,它似乎並不像opengl本身有一些滯後,因爲我可以例如旋轉圖片,沒有看到任何滯後。
什麼可能是滯後的原因?
UPD:binddata的 代碼:
public void bindData(ScannerShaderProgram scannerProgram) {
//getting location of each attribute for shader program
vertexArray.setVertexAttribPointer(
0,
scannerProgram.getPositionAttributeLocation(),
POSITION_COMPONENT_COUNT,
0
);
你能解釋bindData()在做什麼嗎?我認爲你正在向GPU傳遞每幀數據。 – codetiger
@codetiger當然,發佈udpated,你可能會在第一篇文章中找到它的解釋和來源 –