[英]OpenGL ES2.0 - After restarting the App, everything looks.. weird
編輯:
更多的調試使我想到glGetAttribLocation返回-1,除了應用程序的第一次啟動。 程序ID有效(我猜是嗎?),目前在我的測試中為12。 我還嘗試在再次繪制之前檢索屬性位置,但這都無法解決。
我的着色器“體系結構”現在看起來像這樣:
我已經將着色器變成了單例。 即只有一個實例。 使用它:
public void useProgram() {
GLES20.glUseProgram(iProgram);
getUniformLocations();
getAttributeLocations();
}
即程序將被發送到OpenGL,之后我將檢索所有變量的統一位置和屬性位置,它們存儲在HashMap中(每個着色器一個):
@Override
protected void getAttributeLocations() {
addToGLMap(A_NORMAL, GLES20.glGetAttribLocation(iProgram, A_NORMAL));
addToGLMap(A_POSITION, GLES20.glGetAttribLocation(iProgram, A_POSITION));
addToGLMap(A_COLOR, GLES20.glGetAttribLocation(iProgram, A_COLOR));
}
我不明白,為什么程序的ID例如是12,但是在我的應用程序的第二次及以后的運行中所有屬性位置都不存在...
在我的應用程序中,我正在加載一個Wavefront對象,並繪制了一些線和立方體,只是為了嘗試一些東西。 在“干凈”啟動應用程序后,即重新啟動或安裝應用程序后,一切看起來都按預期進行。 但是,如果我關閉該應用程序然后重新打開,它看起來很奇怪,屏幕截圖位於底部。
我目前正在做什么:
onSurfaceCreated:
請注意清除,清除顏色等。清除所有加載的對象(僅出於測試目的,當然在以后不會刪除內存)。 重新加載對象(線程)。
我的對象存儲如下:
public class WavefrontObject {
private FloatBuffer mPositionBuffer = null;
private FloatBuffer mColorBuffer = null;
private FloatBuffer mNormalBuffer = null;
private ShortBuffer mIndexBuffer = null;
}
他們被畫成:
mColorBuffer.position(0);
mNormalBuffer.position(0);
mIndexBuffer.position(0);
mPositionBuffer.position(0);
GLES20.glVertexAttribPointer(mShader.getGLLocation(BaseShader.A_POSITION), 3, GLES20.GL_FLOAT, false,
0, mPositionBuffer);
GLES20.glEnableVertexAttribArray(mShader.getGLLocation(BaseShader.A_POSITION));
// etc...
GLES20.glDrawElements(GLES20.GL_TRIANGLES, mIndexBuffer.capacity(), GLES20.GL_UNSIGNED_SHORT, mIndexBuffer);
我正在加載的模型顯示一個小型玩具飛機。 重新啟動應用程序后,看起來像這樣(加載對象,所有顏色均設置為白色(用於測試)):
因此,對我來說,緩沖區中似乎有剩余的東西? 使用這些緩沖區的“最佳實踐”是什么? 禁用陣列? OpenGL ES2.0是否提供在將值放入其中之前可以使用的“清除緩沖區”方法?
預期繪制的內容:在“怪異的三角形”和顏色所源自的點上,應該有平面模型。 都是白色的。
當您的應用程序丟失上下文時,其OpenGL上下文將被破壞。 因此,所有對象(程序及其統一/屬性句柄等)均無效。
在重新打開期間,您必須清除/使像您一樣的所有單例對象無效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.