GLSL着色器(编译错误)

时间:2018-06-09 23:28:14

标签: opengl 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"
                        "}\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

read GLSL shaders from file

1 个答案:

答案 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;在编译错误中提到。