Я сделал простой 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; \
} \
\
"