无法编译GL ES 2.0 Shader

时间:2011-11-23 14:25:35

标签: c opengl-es opengl-es-2.0

我在GLES2之上做了一个简单的API。一切似乎都没问题,但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使用glGetError()检查gl错误,我可以确认它工作正常。

更新

这是Shader源定义:

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

1 个答案:

答案 0 :(得分:1)

我忘了设置EGL以使用GLES2。它使用的是GLES1的默认值。奇怪的是,司机并没有抱怨在GLES1环境中使用GLES2功能。