Android NDK GLES 2.0无图画

时间:2011-04-29 00:54:50

标签: c++ android opengl-es drawing android-ndk

我试图通过NDK绘制GLES 2.0,除了在C ++中创建表面外做任何事情,但屏幕上没有任何东西在绘制......我无法弄清楚原因。

我已经尝试/验证了许多不同的东西,但仍然不知所措。

我最后几次猜测是这些:

我的纹理现在以某种方式与屏幕兼容:

我加载这样的纹理:

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);
}

1 个答案:

答案 0 :(得分:0)

实际上,我不确定究竟发生了什么,但是我改变的东西解决了这个问题= / 我试着回过头来重新打破它,但是不能......

但是作为参考,我无法保证什么被打破,但我可以肯定地说,问题既不是纹理,也不是着色器。即使默认曲面视图设置为RGB_565,使用以下行也可以在NDK中创建纹理, 工作alpha。

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的旧代码。所以我能想到的是,我使用旧代码= /

导致gl以某种方式崩溃