2012-03-08 33 views
0

您好,我現在正在學習OpenGL ES和着色器的使用。我寫了一個測試類,應該只將應用程序圖標繪製到屏幕上。到目前爲止沒有運氣。任何人都可以看到我做錯了什麼,或者可能將我指向正確的方向?使用OpenGL ES着色器進行Android測試

public class GLTester 
{ 


void test(final Context context) 
{ 
    BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inScaled = false; 
    bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon, options); 

    setupGLES(); 
    createProgram(); 
    setupTexture(); 
    draw(); 
} 


void draw() 
{ 
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); 
    glUseProgram(glProgramHandle); 

} 
} 

回答

2

一些事情。

我認爲你的squareVertices緩衝區應該包含4個vec3s。但是你的着色器是爲vec4s設置的。也許這很好,但對我來說似乎很奇怪。

你也沒有設置任何類型的透視矩陣與glFrustum或glOrtho,也沒有設置任何類型的矩陣如Matrix.setLookAtM。您應該始終嘗試保持頂點管線。看這張講座的幻燈片2 https://wiki.engr.illinois.edu/download/attachments/195761441/3-D+Transformational+Geometry.pptx?version=2&modificationDate=1328223370000

我認爲正在發生的事情是你的squareVertices正在經歷這個管道,並在另一側出現像素座標。因此,您的圖像可能是屏幕角落中的一個非常小的規格,因爲您正在使用從-1.0到1.0的頂點。

作爲一個無恥的副作用,我在SourceForge上發佈了一些代碼,使您可以在資產文件夾中從文件中處理和加載着色器,而不必在字符串中作爲.java文件執行。 https://sourceforge.net/projects/androidopengles/ Theres在使用該着色器幫助程序的文件部分中的示例項目。

我希望這個散漫的一些部分是有幫助的。 :)

+0

優秀的答案 – PerracoLabs 2012-03-13 23:06:34

0

它看起來不錯,但我看到一件事你在setupTexture中調用glUniform,而着色器不是當前綁定的。調用glUseProgram之後,應該只調用glUniform。

我不知道這是否是問題,因爲我猜想它可能會默認爲0,但我不知道。

除此之外,你應該熟悉調用glGetError來檢查是否有任何待處理的錯誤條件。

此外,在創建着色器時,其良好的習慣,檢查與glGetShader(GL_COMPILE_STATUS)他們的成功地位,也glGetShaderInfoLog如果編譯失敗,並與glGetProgram/glGetProgramInfoLog程序類似。

+0

我做了你的推薦,我把glGetError放在每個GLES調用下。 GLES20.glEnable下的錯誤1280(GLES20.GL_TEXTURE_2D);經過一些研究後,我發現這個調用對着色器和GLES來說不是必需的。此外,我通過去除glUniform並添加了代碼來檢查着色器和程序編譯狀態。但到目前爲止沒有運氣,我看不到在屏幕上正在繪製的位圖。應該很容易發現問題,但我拉我的頭髮找出它 – PerracoLabs 2012-03-09 07:50:22