获取0:1(1):错误:语法错误,意外$ end尝试编译着色器 [英] Get 0:1(1): error: syntax error, unexpected $end when trying to compile shader

查看:547
本文介绍了获取0:1(1):错误:语法错误,意外$ end尝试编译着色器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在做一个简单的程序来渲染一个三角形。该程序从文件读取顶点着色器和片段着色器并对其进行编译。



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

  // glew 
#define GLEW_STATIC
#include< GL / glew.h>
// GLFW
#include< GLFW / glfw3.h>
#include< string>
#include< fstream>
#include< iostream>
#include< sstream>

//从文件读取着色器
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){
//当用户按下escape键时WindowShouldClose设置为true关闭应用程序
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(){
//初始化带有必要信息的glfw
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);

//使用glfw创建一个窗口
GLFWwindow * window = glfwCreateWindow(800,600,opengl window,nullptr,nullptr);
glfwMakeContextCurrent(window);

//设置所需的键回调函数
glfwSetKeyCallback(window,key_callback);

//初始化glew
glewExperimental = GL_TRUE;
glewInit();

//指定渲染窗口的大小
glViewport(0,0,800,600);

GLuint vao;
glGenVertexArrays(1,& vao);
glBindVertexArray(vao);

float vertices [] = {
0.0f,0.5f,//顶点1(X,Y)
0.5f,-0.5f,//顶点2 ,Y)
-0.5f,-0.5f //顶点3(X,Y)
};

GLuint vbo;
glGenBuffers(1,&v; vbo); //生成1个缓冲区
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);

//编译顶点着色器
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader,1,& vertexSource,NULL);
glCompileShader(vertexShader);

//检查顶点着色器编译成功
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<<缓冲液< std :: endl;

//编译片段着色器
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader,1,& fragmentSource,NULL);
glCompileShader(fragmentShader);

//检查片段着色器编译成功
GLint fragmentStatus;
glGetShaderiv(fragmentShader,GL_COMPILE_STATUS,& fragmentStatus);
std :: cout<< Fragment shader compiled:< fragmentStatus<< std :: endl;
glGetShaderInfoLog(fragmentShader,1024,NULL,buffer);
std :: cout<<缓冲液< std :: endl;

//将着色器编译成程序
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);

//游戏循环
{时
//检查并称之为事件
glfwPollEvents()(glfwWindowShouldClose(窗口)!);

//渲染到这里
render();

//交换缓冲区
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 

在vec2位置;

void main()
{
gl_Position = vec4(position,0.0,1.0);
}



我得到这个错误,当一个着色器不编译, m 99.99%,我的第一行没有可能导致此错误的字符。

  0:1 :语法错误,意想不到的$结束


解决方案

dataString ReadFile的(),所以只要功能是留给你正在返回的指针是无效的。


I'm making a simple program to render a triangle. The program reads a vertex shader and a fragment shader from a file and compiles them. However one of the shaders - but never both of them - will not compile.

This is the source code of my main file:

//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;
}

This is fragmentShader.glsl:

#version 150 core

out vec4 outColor;

void main()
{
  outColor = vec4(1.0, 1.0, 1.0, 1.0);
}

This is vertexShader.glsl

#version 150 core

in vec2 position;

void main()
{
  gl_Position = vec4(position, 0.0, 1.0);
}

I get this error when one of the shaders doesn't compile and I'm 99.99% that there's no garbage characters on my first line that could be causing this.

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

解决方案

Your dataString has only local lifetime in readfile(), so the pointer you are returning is invalid as soon as the function is left.

这篇关于获取0:1(1):错误:语法错误,意外$ end尝试编译着色器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆