【发布时间】:2012-08-24 23:04:17
【问题描述】:
我的 GLSL 着色器 似乎无法编译。偶尔(主要是在编辑文件之后),编译时出现以下错误:
----- SRC ----- (150 B)
#version 330 core
uniform mat4 mvpMatrix;
in vec4 vertexPosition_modelspace;
void main() {
gl_Position = mvpMatrix * vertexPosition_modelspace;
}
gp!
----- END -----
SimpleTransform.vertexshader:Vertex shader failed to compile with the following errors:
ERROR: 0:10: error(#132) Syntax error: 'gp' parse error
ERROR: error(#273) 1 compilation errors. No code generated
这很奇怪,因为我发誓该文件不包含那个尴尬的gp! 部分。尽管如此,我还是用 cat
#version 330 core
uniform mat4 mvpMatrix;
in vec4 vertexPosition_modelspace;
void main() {
gl_Position = mvpMatrix * vertexPosition_modelspace;
}
和少
#version 330 core
uniform mat4 mvpMatrix;
in vec4 vertexPosition_modelspace;
void main() {
gl_Position = mvpMatrix * vertexPosition_modelspace;
}
他们都证明了我是对的。
我想知道是什么导致了这种奇怪的行为。
这里是my project 的链接。您应该可以通过进入 src 目录并输入 make(仅限 Linux)轻松编译它。它需要 GLFW、GLEW、GLM 和 GL3。
还有代码本身:
加载着色器文件
GLuint shader_load(GLenum type, const char filename[]) {
if ((type != GL_VERTEX_SHADER && type != GL_FRAGMENT_SHADER) || !filename) return 0;
/* wczytywanie pliku shadera */
FILE *file = fopen(filename, "rb");
//okreslenie rozmiaru pliku
fseek(file, 0, SEEK_END);
uint32 iFileSize = ftell(file);
fseek(file, 0, SEEK_SET);
//wczytywanie
char *tmp = new char[iFileSize];
memset(tmp, 0, sizeof(tmp));
uint32 iBytes = (uint32) fread(tmp, sizeof(char), iFileSize, file);
fclose(file);
if (iBytes != iFileSize) printf("Warning: reading error possible!\n");
#ifdef _DEBUG_
printf("----- SRC ----- (%d B)\n%s\n----- END -----\n", iBytes, tmp);
#endif
/* przygotowanie shadera */
GLuint shader = glCreateShader(type);
glShaderSource(shader, 1, const_cast<const GLchar**>(&tmp), NULL);
delete[] tmp;
glCompileShader(shader); //kompilacja shadera
/* sprawdzenie statusu kompilacji */
int status = GL_FALSE;
glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
int logsize = 0;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logsize);
char *log = new char[logsize];
glGetShaderInfoLog(shader, logsize, NULL, log);
printf("%s:%s", filename, log);
delete[] log;
if (status != GL_TRUE) return 0;
return shader;
}
【问题讨论】:
-
请在此处显示您的相关代码,您将获得比等待有人下载和挖掘您的项目更好的响应。我猜想不以 null 结尾的着色器字符串存在一些问题。
-
不要把你的项目发给我,让我使用一些复杂的依赖于平台的构建过程来构建它。只需发布相关代码(很可能是着色器加载代码)。即使您删除了项目并且链接在下周失效,这种情况也会持续。
-
@ChristianRau 添加了加载着色器源代码
-
此外,如果您使用 gDEBugger,您可以查看每个着色器实际发送到显卡的代码。 (并非所有显卡驱动在报错时都会显示着色器源代码)
-
Added a sample snippet that shows how the fragment would have been written using
std::string而不是玩弄原始数组,memset,逐个和毛茸茸的演员表:)
标签: c++ linux opengl glsl glfw