2011-04-29 49 views
3

我試圖通過NDK與GLES 2.0畫畫,做一切,除了創造C++的表面,但沒有什麼是在屏幕上繪製......我想不出爲什麼。的Android NDK GLES 2.0沒有圖紙

我已經試過/驗證很多不同的事情,我仍然處於虧損狀態。

我最後的一些猜測是這些:

我的紋理都弄好了,現在與屏幕兼容:

我加載紋理是這樣的:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image->GetPixels()); 

但默認GLSurfaceView格式是RGB_565

我試過這個沒成功:

mGLView.getHolder().setFormat(PixelFormat.RGBA_8888); 

而且這樣的:

glTexImage2D(GL_TEXTURE_2D, 0, GL_UNSIGNED_SHORT_5_6_5, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image->GetPixels()); 

可能紋理格式有什麼關係的問題?我沒有引用,因爲Android的SDK抽象這個完全消失..

這是我使用的着色器:

const char *vertexShader = "\ 
    uniform mat4 uMtxProjection; \ 
    uniform mat4 uMtxModelView; \ 
    attribute vec2 aPosition; \ 
    attribute vec2 aTexCoord; \ 
    varying vec2 vTexCoord; \ 
    void main() \ 
    { \ 
     gl_Position = uMtxProjection * (uMtxModelView * vec4(aPosition.x, aPosition.y, 0.0, 1.0)); \ 
     vTexCoord = aTexCoord; \ 
    }"; 

const char *fragmentShader = "\ 
    precision mediump float; \ 
    varying vec2 vTexCoord; \ 
    uniform sampler2D sTexture; \ 
    void main() \ 
    { \ 
     gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); \ 
    }"; 

進一步測試後,除去質地(只用紅色填充三角形),我可以看到一個扭曲的紅色框閃光每個應用程序運行時,則屏幕變爲空白=/

和鄰矩陣恰好3次:

Mat4 Ortho2D(float left, float right, float bottom, T top, float zNear, float zFar) 
{ 
    float dx = right - left; 
    float dy = top - bottom; 
    float dz = zFar - zNear; 

    // avoid division by zero 
    float tx = (dx != 0) ? -(right + left)/dx : 0; 
    float ty = (dy != 0) ? -(top + bottom)/dy : 0; 
    float tz = (dz != 0) ? -(zFar + zNear)/dz : 0; 

    return Mat4(2.0f/dx, 0,   0,   tx, 
       0,   2.0f/dy, 0,   ty, 
       0,   0,   -2.0f/dz, tz, 
       0,   0,   0,   1); 
} 
+0

從基礎開始。你的glClearColor是你期望的嗎?你的着色器加載沒有任何錯誤? – CaseyB 2011-04-29 01:50:38

+0

是的。屏幕被正確地清除爲指定的顏色,並且着色器錯誤(或缺失)確實被打印到控制檯。我也證實了我的鄰矩陣函數產生了一個和glOrtho()相同的矩陣。 – bitwise 2011-04-29 01:57:49

+0

實際上,我已經把紋理拿出了現在的等式,並簡單地用紅色填充三角形,現在,我得到了一些快速扭曲的紅色閃爍,但僅適用於前半秒的應用程序運行=/ – bitwise 2011-04-29 02:02:39

回答

0

實際上,我不確定究竟發生了什麼,但是我改變了一些問題修復了這個問題=/ 我試着回過頭來重新打破它,但不能。

但是僅供參考,我可以「T保證什麼被打破了,但我可以肯定地說,這個問題是無論是質感,也不着色器。即使默認面視圖設置爲RGB_565,使用以下行創建一個質地就好在NDK,工作透明度。

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image->GetPixels()); 

我使用的投影矩陣也很好,因爲我直接從openGL規範中複製它。

我注意到,在調用glEnable(TEXTURE_2D)導致錯誤(無效的枚舉),因爲它涉及到opengl的固定功能管道,並且我使用GLES2.0 ...我正在複製一些我的舊代碼來自一個固定函數實現GLES1。因此,所有我能想到的是,我是造成冰川以某種方式與舊代碼崩潰=/