我在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; \
} \
\
"
答案 0 :(得分:1)
我忘了设置EGL以使用GLES2。它使用的是GLES1的默认值。奇怪的是,司机并没有抱怨在GLES1环境中使用GLES2功能。