Не могу скомпилировать шейдер GL ES 2.0 - PullRequest
3 голосов
/ 23 ноября 2011

Я сделал простой API поверх GLES2.Все вроде бы нормально, но состояние GL_COMPILE_STATUS равно GL_FALSE.

У меня есть такая структура:

typedef struct MyGLShader__
{
    GLuint uiHandle;
    GLenum eType;   
    const char *pcSource;

} MyGLShader;

Я инициализирую ее таким образом и создаю шейдер, используямоя функция:

MyGLShader shader = {0, GL_VERTEX_SHADER, MY_VERTEX_SHADER_SOURCE};
shader_create(&shader);

Эта функция должна создавать шейдер:

MyStatus shader_create(MyGLShader *pShader)
{
    MyStatus eStatus;

    pShader->uiHandle = glCreateShader(pShader->eType);
    MY_GL_VALIDATE("glCreateShader");

    glShaderSource(pShader->uiHandle, 1, &pShader->pcSource, NULL);
    MY_GL_VALIDATE("glShaderSource");

    glCompileShader(pShader->uiHandle);
    eStatus = shader_check(pShader);
    if (eStatus != MY_STATUS_OK)
    {
        return eStatus;
    }

    return MY_STATUS_OK;
}

Работает без проблем, пока не вызовет shader_check():

static MyStatus shader_check(MyGLShader *pShader)
{
    GLint status;
    LOGI("Checking shader compilation status...");

    glGetShaderiv(pShader->uiHandle, GL_COMPILE_STATUS, &status);

    if (status != GL_TRUE)
    {
        LOGE("Shader compilation has failed");
        shader_log_infolog(pShader);

        return MY_STATUS_ERROR;
    }

    return MY_STATUS_OK;
}

Который натыкается на: if (status != GL_TRUE).

После этого, когда он пытается напечатать инфолог в shader_log_infolog:

static void shader_log_infolog(
        MyGLShader *pShader, MyStatus eStatus)
{
    char acbuffer[INFO_LENGTH];

    glGetShaderInfoLog(pShader->uiHandle, INFO_LENGTH, NULL, (char *) &acbuffer);
    LOGE("Shader Log: %s", acbuffer)
}

Он не печатает никаких журналов, т.е. толькопечатает

Журнал шейдеров:

Любые идеи, что я могу делать неправильно при инициализации.MY_GL_VALIDATE проверяет наличие ошибок gl с помощью glGetError(), и я могу подтвердить, что он работает нормально.

UPDATE

Вот определение источника шейдера:

#define MY_VERTEX_SHADER_SOURCE \
                                \
"                               \
attribute   vec4 a_Position;    \
                                \
void main() {                   \
    gl_Position = a_Position;   \
}                               \
                                \
"

1 Ответ

1 голос
/ 31 мая 2012

Я забыл настроить EGL для использования GLES2. Он использовал значения по умолчанию для GLES1. Как ни странно, драйверы не жаловались на использование функций GLES2 в контексте GLES1.

...