Android NDK GLES 2.0 Ничего Рисование - PullRequest
3 голосов
/ 29 апреля 2011

Я пытаюсь рисовать с помощью GLES 2.0 через NDK, делаю все, кроме создания поверхности в C ++, но на экране ничего не рисует ... И я не могу понять, почему.

IЯ пробовал / проверял много разных вещей и все еще в замешательстве.

мои последние несколько предположений таковы:

мои текстуры как-то теперь совместимы с экраном:

Iзагрузить текстуры, как это:

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 голосов
/ 29 апреля 2011

На самом деле, я не уверен, что именно происходило, но что-то, что я изменил, решило проблему = / Я попытался вернуться к коду, чтобы снова его сломать, но не смог ..

но для справки, я не могу гарантировать, что было сломано, но я могу точно сказать, что проблема была не в текстуре и не в шейдере.Даже если для вида поверхности по умолчанию задано значение 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.Так что все, о чем я могу думать, - это то, что я вызываю сбой gl из-за старого кода = /

...