获取0:1(1):错误:语法错误,尝试编译着色器时意外$end

Get 0:1(1): error: syntax error, unexpected $end when trying to compile shader

本文关键字:错误 意外 end 编译 语法 获取      更新时间:2023-10-16

我正在制作一个简单的程序来渲染三角形。该程序从文件中读取顶点着色器和片段着色器并对它们进行编译。但是,其中一个着色器(但决不能同时包含两个着色器)将不会编译。

这是我的主文件的源代码:

//glew
#define GLEW_STATIC
#include <GL/glew.h>
//GLFW
#include <GLFW/glfw3.h>
#include <string>
#include <fstream>
#include <iostream>
#include <sstream>
//Read shaders from file
const GLchar* readfile(std::string filename){
  std::ifstream file (filename, std::ifstream::in);
  std::stringstream buffer;
  buffer << file.rdbuf();
  std::string dataString = buffer.str();
  const char *dataCString = dataString.c_str();
  const GLchar *data = const_cast<GLchar*>(dataCString);
  file.close();
  return data;
}
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode){
  //when user presses the escape key WindowShouldClose is set to true closing the application
  if(key == GLFW_KEY_ESCAPE && action == GLFW_PRESS){
    glfwSetWindowShouldClose(window, GL_TRUE);
  }
}
void render(){
  glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
  glClear(GL_COLOR_BUFFER_BIT);
  glDrawArrays(GL_TRIANGLES, 0,3);
}
int main(){
  //initialize glfw with necessary information
  glfwInit();
  glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
  glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
  glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
  glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
  glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
  //create a window with glfw
  GLFWwindow* window = glfwCreateWindow(800, 600, "opengl window", nullptr, nullptr);
  glfwMakeContextCurrent(window);
  //set required key callback functions
  glfwSetKeyCallback(window, key_callback);
  //initialize glew
  glewExperimental = GL_TRUE;
  glewInit();
  //specify size of rendering window
  glViewport(0, 0, 800, 600);
  GLuint vao;
  glGenVertexArrays(1, &vao);
  glBindVertexArray(vao);
  float vertices[]={
    0.0f, 0.5f, //Vertex 1 (X, Y)
    0.5f, -0.5f, //Vertex 2 (X, Y)
    -0.5f, -0.5f //Vertex 3 (X, Y)
  };
  GLuint vbo;
  glGenBuffers(1, &vbo); //Generate 1 buffer
  glBindBuffer(GL_ARRAY_BUFFER, vbo);
  glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
  const GLchar* vertexSource = readfile("vertexShader.glsl");
  const GLchar* fragmentSource = readfile("fragmentShader.glsl");
  //Compile vertex shader 
  GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
  glShaderSource(vertexShader, 1, &vertexSource, NULL);
  glCompileShader(vertexShader);
  //Check vertex shader compiled sucessfully
  GLint vertexStatus;
  glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &vertexStatus);
  std::cout << "Vertex shader compiled: " << vertexStatus << std::endl;
  char buffer[1024];
  glGetShaderInfoLog(vertexShader, 1024, NULL, buffer);
  std::cout << buffer << std::endl;
  //Compile fragment shader
  GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  glShaderSource(fragmentShader, 1, &fragmentSource, NULL);
  glCompileShader(fragmentShader);
  //Check fragment shader compiled sucessfully
  GLint fragmentStatus;
  glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &fragmentStatus);
  std::cout << "Fragment shader compiled: " <<  fragmentStatus << std::endl;
  glGetShaderInfoLog(fragmentShader, 1024, NULL, buffer);
  std::cout << buffer << std::endl;
  //Compile shaders into program
  GLuint shaderProgram = glCreateProgram();
  glAttachShader(shaderProgram, vertexShader);
  glAttachShader(shaderProgram, fragmentShader);
  glBindFragDataLocation(shaderProgram, 0, "outColor");
  glLinkProgram(shaderProgram);
  glUseProgram(shaderProgram);
  GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
  glEnableVertexAttribArray(posAttrib);
  glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0);
  //game loop
  while(!glfwWindowShouldClose(window)){
    //check and call events
    glfwPollEvents();
    //rendering goes here
    render();
    //swap the buffers
    glfwSwapBuffers(window);
  }
  glfwTerminate(); 
  return 0;
}

这是fragmentShader.glsl:

#version 150 core
out vec4 outColor;
void main()
{
  outColor = vec4(1.0, 1.0, 1.0, 1.0);
}

这是vertexShader.glsl

#version 150 core
in vec2 position;
void main()
{
  gl_Position = vec4(position, 0.0, 1.0);
}

当其中一个着色器未编译时,我会出现此错误,并且我确信第一行中没有可能导致此错误的垃圾字符。

0:1(1): error: syntax error, unexpected $end

您的dataStringreadfile()中只有本地生存期,因此函数一离开,您返回的指针就无效。

我也遇到了类似的问题。在编译它们之前,我正在从txt文件中读取着色器。网络中的示例将着色器存储为char*[]。这可能导致这里列出的错误;预处理器错误:在"#"之后有非法的非指令;由于空白和无效终止的恶作剧。

&vertexSource更改为vertexSource将使编译器正确地将其读取为一个没有空终止符的长字符串。