gpt4 book ai didi

c++ - 当我的着色器文件的所有信息都被正确读入字符串并且语法正确时,为什么 OpenGL 会给出语法错误

转载 作者:行者123 更新时间:2023-11-30 03:46:10 24 4
gpt4 key购买 nike

我正在学习 learnopengl.com 上的教程,它们的着色器已直接放入 const char* 中。当我尝试将相同的代码放入着色器文件,然后将其读入 const char*,所有代码都相同时,glGetShaderiv() 会生成语法错误。

这是错误:ERROR: 0:1: '' syntax error: illegal extended ASCII character (0xdd).

但是,当代码直接放入 const char* 时,不会出现此错误

这是 const char* 代码与我的代码的对比

常量字符*:

    const GLchar* vertexShaderSource = "#version 330 core\n"
"layout (location = 0) in vec3 position;\n"
"void main()\n"
"{\n"
"gl_Position = vec4(position.x, position.y, position.z, 1.0);\n"
"}\0";

const GLchar* orangeFragmentShaderSource = "#version 330 core\n"
"out vec4 color;\n"
"void main()\n"
"{\n"
"color = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"
"}\n\0";

const GLchar* yellowFragmentShaderSource = "#version 330 core\n"
"out vec4 color;\n"
"void main()\n"
"{\n"
"color = vec4(1.0f, 1.0f, 0.0f, 1.0f); // The color yellow \n"
"}\n\0";

我的顶点文件:

      #version 330 core

layout (location = 0) in vec3 position;

void main() {

gl_Position = vec4(position.x, position.y, position.z, 1.0);

}

我的黄色片段着色器:

      #version 430 core

out vec4 colour;

void main() {

colour = vec4(1.0f, 1.0f, 0.0f, 1.0f);

}

我的橙色片段着色器:

     #version 430 core

out vec4 colour;

void main() {

colour = vec4(1.0f, 1.0f, 0.0f, 1.0f);

}

另外,这是我用来将我的着色器转换为字符串的代码:

      std::ifstream shaderFile(filePath);
std::stringstream tmp;

std::string fileContents = "";
std::string line = "";

while (std::getline(shaderFile, line)) fileContents += line + "\n";

return fileContents + "\0";

这是我尝试从我的文件中读取的另一种方法

   std::ifstream shaderFile(filePath);

if (!shaderFile.good()) {
std::cout << "File failed to load..." << filePath << std::endl;
std::system("PAUSE");
std::exit(1);
}

return std::string(std::istreambuf_iterator<char>(shaderFile), std::istreambuf_iterator<char>());

我的着色器编译代码:

tmp = convertShaders("VertexShader.vert");
const GLchar *vertexShaderSource = tmp.c_str();
std::cout << vertexShaderSource << std::endl;

tmp = convertShaders("FragmentShaderYellow.frag");
const GLchar *yellowFragmentShaderSource = tmp.c_str();

tmp = convertShaders("FragmentShaderOrange.frag");
const GLchar *orangeFragmentShaderSource = tmp.c_str();

glShaderSource(vertexShaderID, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShaderID);
glGetShaderiv(vertexShaderID, GL_COMPILE_STATUS, &success);

glShaderSource(yellowFragmentShaderID, 1, &yellowFragmentShaderSource, NULL);
glCompileShader(yellowFragmentShaderID);
glGetShaderiv(yellowFragmentShaderID, GL_COMPILE_STATUS, &success);


glShaderSource(orangeFragmentShaderID, 1, &orangeFragmentShaderSource, NULL);
glCompileShader(orangeFragmentShaderID);
glGetShaderiv(orangeFragmentShaderID, GL_COMPILE_STATUS, &success);

我不知道为什么我的字符串不起作用 当我将字符串输出到控制台时,一切看起来都一样。有人可以帮助我吗?

最佳答案

当您调用 tmp.c_str() 时,您会收到一个指向 tmp 拥有的字符串的指针。

然后调用 tmp = something_else;分配了一个新的内存块来保存新的字符串,并且指针(例如 vertexShaderSource)现在无效。它被称为悬挂指针。

一个简单的解决方法是更改​​:

tmp = convertShaders("VertexShader.vert");
const GLchar *vertexShaderSource = tmp.c_str();
std::cout << vertexShaderSource << std::endl;

tmp = convertShaders("FragmentShaderYellow.frag");
const GLchar *yellowFragmentShaderSource = tmp.c_str();

tmp = convertShaders("FragmentShaderOrange.frag");
const GLchar *orangeFragmentShaderSource = tmp.c_str();

到:

tmp = convertShaders("VertexShader.vert");
const GLchar *vertexShaderSource = tmp.c_str();
std::cout << vertexShaderSource << std::endl;

std::string tmp2 = convertShaders("FragmentShaderYellow.frag");
const GLchar *yellowFragmentShaderSource = tmp2.c_str();

std::string tmp3 = convertShaders("FragmentShaderOrange.frag");
const GLchar *orangeFragmentShaderSource = tmp3.c_str();

通过使用 3 个不同的 tmp std::string,您可以避免旧内容失效的问题。

关于c++ - 当我的着色器文件的所有信息都被正确读入字符串并且语法正确时,为什么 OpenGL 会给出语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34249971/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com