2016-08-20 20 views
0

我已經爲我的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 
    ); 
+0

你能解釋bindData()在做什麼嗎?我認爲你正在向GPU傳遞每幀數據。 – codetiger

+0

@codetiger當然,發佈udpated,你可能會在第一篇文章中找到它的解釋和來源 –

回答

0

聽起來好像精度問題。試着從你的着色器中取出這條線:

float scale = mod(u_ElapsedTime,2.); 

然後在CPU上執行它。例如

elapsedTime = ((SystemClock.currentThreadTimeMillis()-startTime)%200)/100f; 
+0

好的,它一定會解決問題,但是你能告訴我這裏的精確度有什麼問題嗎?我應該改變精度到「高」,以正確計算着色器? –

+0

highp可能會有所幫助,但請記住,如果您正在片段着色器上進行計算,並非所有實現都必須支持highp。即使着色器使用單浮點精度,如果時間充裕,您的方法也會失去精度。單精度浮點只給出7個有效數字,所以在10000秒左右後,計算可能明顯不準確。這就是爲什麼我建議使用整數模運算。 – Columbo

相關問題