我正在尝试使用从文件加载的简单glsl着色器。这就是我所拥有的:
GLuint
shdld(char *path) {
GLuint shd;
GLint cflag, nlog;
FILE *fp;
int i, c;
GLchar source[1000], elog[1000];
fp = fopen(path, "r");
if (fp == NULL) {
printf("Unable to open file %s\n", path);
return 0;
}
for (i = 0; (c = getc(fp)) != EOF; i++)
source[i] = c;
source[i++] = '\0';
fclose(fp);
shd = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(shd, 1, source, NULL);
glCompileShader(shd);
cflag = GL_FALSE;
glGetShaderiv(shd, GL_COMPILE_STATUS, &cflag);
if (cflag == GL_FALSE) {
glGetShaderInfoLog(shd, sizeof elog, NULL, elog);
printf("Unable to compile shader %s\n", path);
printf("%s\n", elog);
glDeleteShader(shd);
return 0;
}
return shd;
}
不幸的是着色器不能编译,更糟糕的是elog包含一些垃圾内容而不是日志消息。我的问题是:如何获取错误消息并将其显示到stdout以调试我的着色器?
答案 0 :(得分:2)
您如何确保该文件不包含超过1000
个字符,或者增加缓冲区大小,或者
更改此部分
for (i = 0; (c = getc(fp)) != EOF; i++)
source[i] = c;
source[i++] = '\0';
如果您只是获取文件大小,这是获得它的一种可能方式
size_t fileSize;
fseek(fp, 0, SEEK_END);
fileSize = ftell(fp);
rewind(fp);
然后您可以将source
声明为GLchar *source
,并动态分配
source = malloc((1 + fileSize) * sizeof(GLchar));
if (source == NULL) /* always check the output of malloc */
return SOME_INVALIDE_GLuint;
source[fileSize] = '\0';
然后
fread(source, szeof(GLchar), fileSize, fp); // check return value to ensure fileSize bytes were read
fclose(fp);
最后不要忘记
free(source);
答案 1 :(得分:1)
如果你有任何严格的错误检查,这甚至不应该编译。如果您启用了合理的警告级别,它至少会给您一个警告。
在此电话会议中:
GLchar source[1000], elog[1000];
...
glShaderSource(shd, 1, source, NULL);
第三个参数的类型错误。 glShaderSource()
的原型是:
void glShaderSource(GLuint shader, GLsizei count, const GLchar **string, const GLint *length);
请注意,第3个参数是指向的指针,而传递的数组在将其作为函数参数传递时会衰减为指针。
电话需要:
GLchar* sourcePtr = source;
glShaderSource(shd, 1, &sourcePtr, NULL);