我已经阅读了所有推荐的帖子,我已经尝试了这些解决方案,但没有一个有帮助。
简而言之,问题在于第三个论点
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"
"} ";
但是我想从文件中读取它,以下代码有效
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()] = ' ';
传递glShaderSource(vertexShader, 1, &writable, NULL);
也不起作用。 我一直收到以下错误,即使使用教程中的另一个复制和粘贴代码
0:1(4): preprocessor error: syntax error, unexpected HASH_TOKEN
我还能做什么?
我读过这些帖子: 使用结构从.txt文件中读取着色器
从文件中读取 GLSL 着色器
以下是我用来加载着色器源的代码:
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()
的规格。
不确定您的情况是什么问题。我已经成功地使用了rn
行尾和n
行尾。也许您在文件的开头有一个U+FEFF
BOM 字符?它可以与编译错误中提到的"哈希"一起使用。