我已经阅读了所有推荐的帖子,我已经尝试了这些解决方案,但没有人帮助过。
简而言之,问题在于
的第三个论点glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
此代码工作:
const char *vertexShaderSource = "#version 120 \n"
"attribute vec3 pos;\n"
"attribute vec2 texCoord;\n"
"varying vec2 texCoord0;\n"
"uniform mat4 transform;\n"
"void main()\n"
"{\n"
" gl_Position = transform * vec4(pos, 1.0);\n"
" texCoord0 = texCoord;\n"
"}\0";
但是我希望在代码工作之后从文件中读取它
std::string s= "vertex";
std::ifstream file(s.c_str());
std::stringstream buffer;
buffer << file.rdbuf();
std::string str = buffer.str();
std::cout << str;
正在输出:
#version 120
attribute vec3 pos;
attribute vec2 texCoord;
varying vec2 texCoord0;
uniform mat4 transform;
void main()
{
gl_Position = transform * vec4(pos, 1.0);
texCoord0 = texCoord;
}
我知道我不能简单地用这样的代码转换字符串:
const char *vertexShaderSource = str.c_str();
并将其传递到:glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
所以我使用了以下代码来防止它停止存在:
char * writable = new char[str.size() + 1];
std::copy(str.begin(), str.end(), writable);
writable[str.size()] = '\0';
传递glShaderSource(vertexShader, 1, &writable, NULL);
也不起作用。
我一直在跟踪错误,即使是教程中的另一个复制和粘贴代码
0:1(4): preprocessor error: syntax error, unexpected HASH_TOKEN
我还能做些什么?
我看过这些帖子: Reading a shader from a .txt file using a structure
答案 0 :(得分:0)
以下是我用来加载着色器源的代码:
ifstream iStream(filename);
stringstream buffer;
buffer << iStream.rdbuf();
string source = buffer.str();
const char* sources[] = { source.c_str() };
glShaderSource(handle, 1, sources, 0);
如您所见,string
可以直接提供给glShaderSource
;没有必要创建它的副本。如果您不相信,请查看c_str()
的规范。
不确定您的情况是什么问题。我已成功使用\r\n
和\n
行结尾。也许你在文件的开头有一个U+FEFF
BOM character?它可以用&#34; hash&#34;在编译错误中提到。