【发布时间】:2015-01-26 12:32:22
【问题描述】:
我正在尝试从.txt 文件加载一个简单的 GLSL 程序。这是加载文件的函数:
string getShaderSource(char path[])
{
string out;
ifstream mFile;
stringstream buf;
mFile.open(path);
if (mFile.is_open())
{
buf << mFile.rdbuf();
out = buf.str();
}
else
printf("Cannot open shader source file.");
mFile.close();
//out.append("\0");
return out;
}
我使用这样的函数:
string vs = getShaderSource("C:/vs.txt");
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, (const GLchar**)&vs, NULL);
问题是着色器无论如何都无法编译,这是错误:
0(1) : error C0000: syntax error, unexpected $undefined at token "<undefined>"
非常简单的 GLSL 代码:
#version 410
layout (location = 0) in vec3 vp;
layout (location = 1) in vec3 color;
smooth out vec4 theColor;
void main () {
gl_Position = vec4 (vp, 1.0);
theColor = vec4(color, 0.0);
}
我知道那里有类似的问题,我已经尝试了很多来解决问题,但没有任何进展。我做错了什么?
【问题讨论】:
-
您已经展示了加载着色器源的代码,但问题在于着色器源的编译。请出示这个。要排除您的着色器源加载器,请暂时对您的着色器源进行硬编码,然后查看是否收到相同的消息。
-
vs是什么类型的? -
@Axalo std::string,抱歉 fs 是一个错字。
-
@Poldie 是的,我尝试将 GLSL 代码存储为
const char*,这样可以正常工作,但当我尝试从文件加载它时却不行。我认为我的 txt 文件加载功能有问题。 -
最好接受指向字符的指针,因为必须初始化数组(它们是引用)。 OpenGL 不会理解字符串,因此不建议返回它然后执行丑陋的类型转换。最好将字符串转换为 char* 然后将其传入。另外,添加片段着色器,否则您将看不到任何颜色。