为什么 glsl '#version' 定义给我一个错误?
Why is the glsl '#version' definition giving me an error?
我有一个简单的着色器创建管道。没什么特别的。据我所知,着色器源代码正确读取。最初,我将着色器代码放在后缀为“.glsl”的文件中只是因为我想这样做,但它们现在是普通的“.txt”文件。
阅读着色器代码后,我编译着色器和 link 着色器并检查编译状态和信息日志是否有错误。下面的实际着色器代码在我看来并没有错误,因为它现在基本上不是您可以在网上找到的简单教程的复本,如果您需要,我会 link。
不过我确实遇到了一个错误,它是“0(1):错误 C0104:未知的预处理器指令 #version330”。
这对于顶点着色器和片段着色器都是一样的,它们具有几乎相同的创建过程。
我的驱动版本也是[4.6.0 NVIDIA 445.87],所以我应该可以使用#version 330。
我确实也将它们都设置为“#version 330 core”,但我遇到了同样的错误。
这是我的程序和着色器创建过程。
struct s_Program
{
uint32_t program, vert, frag;
s_Program()
{
vert = glCreateShader(GL_VERTEX_SHADER);
frag = glCreateShader(GL_FRAGMENT_SHADER);
program = glCreateProgram();
}
bool genVert(const char* fpath)
{
std::fstream file(fpath);
if (!file)
{
logf("[FILE_ERROR] : Failed to read shader file.");
return(false);
}
logf("Reading vert shader.");
const char* source;
std::string newSource, line;
while (file >> line)
{
newSource += line;
}
source = newSource.c_str();
glShaderSource(vert, 1, &source, 0);
glCompileShader(vert);
int comp;
glGetShaderiv(vert, GL_COMPILE_STATUS, &comp);
if (comp == GL_FALSE)
{
int maxLength = 0;
glGetShaderiv(vert, GL_INFO_LOG_LENGTH, &maxLength);
std::vector<char> errorLog(maxLength);
glGetShaderInfoLog(vert, maxLength, &maxLength, &errorLog[0]);
logf(&errorLog[0]);
glDeleteShader(vert);
return(false);
}
glAttachShader(program, vert);
return(true);
}
bool genFrag(const char* fpath)
{
std::fstream file(fpath);
if (!file)
{
logf("[FILE_ERROR] : Failed to read shader file.");
return(false);
}
const char* source;
std::string newSource = "", line;
while (file >> line)
{
newSource += line;
}
source = newSource.c_str();
glShaderSource(frag, 1, &source, 0);
glCompileShader(frag);
int comp;
glGetShaderiv(frag, GL_COMPILE_STATUS, &comp);
if (comp == GL_FALSE)
{
int maxLength = 0;
glGetShaderiv(frag, GL_INFO_LOG_LENGTH, &maxLength);
std::vector<char> errorLog(maxLength);
glGetShaderInfoLog(frag, maxLength, &maxLength, &errorLog[0]);
logf(&errorLog[0]);
glDeleteShader(frag);
return(false);
}
glAttachShader(program, frag);
return(true);
}
void linkProgram()
{
glLinkProgram(program); glDetachShader(program, vert); glDetachShader(program, frag);
glDeleteShader(vert); glDeleteShader(frag);
}
void bindProgram()
{ glUseProgram(program); }
void unbindProgram()
{ glUseProgram(0); }
};
这些是我的着色器。
// Vertex
#version 330
in vec4 _pos;
out vec4 aColor;
void main()
{
_pos = vec4(_pos, 1.0);
gl_Position = _pos;
}
// Fragment
#version 330
out vec4 FragColor;
in vec4 _color;
void main()
{
_color = vec4(0.5, 0.5, 0.1, 1.0);
FragColor = _color;
}
这是主文件中的实现。
s_Program mainShader;
if (!mainShader.genVert("data/shaders/standardVert.txt"))
{ logf("[ERR] : Failed to generate Vertex Shader."); }
if (mainShader.genFrag("data/shaders/standardFrag.txt"))
{ logf("[ERR] : Failed to generate Fragment Shader."); }
mainShader.linkProgram();
然后我在我的循环中调用我的函数“bindProgram”设置 GL 使用该程序。
我显然错过了什么,我只想知道什么。
您的 while (file >> line)
循环以 word-by-word 为基础进行读取。将每个单词附加到字符串可以有效地从着色器中去除 所有空格。
相反,执行此操作将文件 as-is 读入 std::string
:
std::stringstream src_ss;
file >> src_ss.rdbuf();
std::string newSource{ src_ss.str() };
我有一个简单的着色器创建管道。没什么特别的。据我所知,着色器源代码正确读取。最初,我将着色器代码放在后缀为“.glsl”的文件中只是因为我想这样做,但它们现在是普通的“.txt”文件。
阅读着色器代码后,我编译着色器和 link 着色器并检查编译状态和信息日志是否有错误。下面的实际着色器代码在我看来并没有错误,因为它现在基本上不是您可以在网上找到的简单教程的复本,如果您需要,我会 link。
不过我确实遇到了一个错误,它是“0(1):错误 C0104:未知的预处理器指令 #version330”。 这对于顶点着色器和片段着色器都是一样的,它们具有几乎相同的创建过程。
我的驱动版本也是[4.6.0 NVIDIA 445.87],所以我应该可以使用#version 330。 我确实也将它们都设置为“#version 330 core”,但我遇到了同样的错误。
这是我的程序和着色器创建过程。
struct s_Program
{
uint32_t program, vert, frag;
s_Program()
{
vert = glCreateShader(GL_VERTEX_SHADER);
frag = glCreateShader(GL_FRAGMENT_SHADER);
program = glCreateProgram();
}
bool genVert(const char* fpath)
{
std::fstream file(fpath);
if (!file)
{
logf("[FILE_ERROR] : Failed to read shader file.");
return(false);
}
logf("Reading vert shader.");
const char* source;
std::string newSource, line;
while (file >> line)
{
newSource += line;
}
source = newSource.c_str();
glShaderSource(vert, 1, &source, 0);
glCompileShader(vert);
int comp;
glGetShaderiv(vert, GL_COMPILE_STATUS, &comp);
if (comp == GL_FALSE)
{
int maxLength = 0;
glGetShaderiv(vert, GL_INFO_LOG_LENGTH, &maxLength);
std::vector<char> errorLog(maxLength);
glGetShaderInfoLog(vert, maxLength, &maxLength, &errorLog[0]);
logf(&errorLog[0]);
glDeleteShader(vert);
return(false);
}
glAttachShader(program, vert);
return(true);
}
bool genFrag(const char* fpath)
{
std::fstream file(fpath);
if (!file)
{
logf("[FILE_ERROR] : Failed to read shader file.");
return(false);
}
const char* source;
std::string newSource = "", line;
while (file >> line)
{
newSource += line;
}
source = newSource.c_str();
glShaderSource(frag, 1, &source, 0);
glCompileShader(frag);
int comp;
glGetShaderiv(frag, GL_COMPILE_STATUS, &comp);
if (comp == GL_FALSE)
{
int maxLength = 0;
glGetShaderiv(frag, GL_INFO_LOG_LENGTH, &maxLength);
std::vector<char> errorLog(maxLength);
glGetShaderInfoLog(frag, maxLength, &maxLength, &errorLog[0]);
logf(&errorLog[0]);
glDeleteShader(frag);
return(false);
}
glAttachShader(program, frag);
return(true);
}
void linkProgram()
{
glLinkProgram(program); glDetachShader(program, vert); glDetachShader(program, frag);
glDeleteShader(vert); glDeleteShader(frag);
}
void bindProgram()
{ glUseProgram(program); }
void unbindProgram()
{ glUseProgram(0); }
};
这些是我的着色器。
// Vertex
#version 330
in vec4 _pos;
out vec4 aColor;
void main()
{
_pos = vec4(_pos, 1.0);
gl_Position = _pos;
}
// Fragment
#version 330
out vec4 FragColor;
in vec4 _color;
void main()
{
_color = vec4(0.5, 0.5, 0.1, 1.0);
FragColor = _color;
}
这是主文件中的实现。
s_Program mainShader;
if (!mainShader.genVert("data/shaders/standardVert.txt"))
{ logf("[ERR] : Failed to generate Vertex Shader."); }
if (mainShader.genFrag("data/shaders/standardFrag.txt"))
{ logf("[ERR] : Failed to generate Fragment Shader."); }
mainShader.linkProgram();
然后我在我的循环中调用我的函数“bindProgram”设置 GL 使用该程序。
我显然错过了什么,我只想知道什么。
您的 while (file >> line)
循环以 word-by-word 为基础进行读取。将每个单词附加到字符串可以有效地从着色器中去除 所有空格。
相反,执行此操作将文件 as-is 读入 std::string
:
std::stringstream src_ss;
file >> src_ss.rdbuf();
std::string newSource{ src_ss.str() };