GLSL 着色器(编译错误)



我已经阅读了所有推荐的帖子,我已经尝试了这些解决方案,但没有一个有帮助。

简而言之,问题在于第三个论点

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+FEFFBOM 字符?它可以与编译错误中提到的"哈希"一起使用。

最新更新