1
votes

I have two simple shaders (vertex and fragment)

Vertex Shader

#version 330 core

//=============================================
//---[Structs/Vertex Data]---------------------
//=============================================

layout(location = 0) in vec3 vertexPosition_modelspace;

//=============================================
//---[Variables]-------------------------------
//=============================================

uniform mat4 projection;
uniform mat4 view;

//=============================================
//---[Vertex Shader]---------------------------
//=============================================

void main()
{
   gl_Position = projection * view * vertexPosition_modelspace;
}

Fragment Shader

#version 330 core

//=============================================
//---[Output Struct]---------------------------
//=============================================

out vec3 colour;

//=============================================
//---[Fragment Shader]-------------------------
//=============================================

void main()
{
    colour = vec3(1, 0, 0);
}

I am trying to compile them and I get the following error

error C0000: syntax error, unexpected $undefined, expecting "::" at token "undefined"

I believe this may have something to do with the way I am reading the files. Here is an example for the vertex shader file

std::string VertexShaderCode = FindFileOrThrow(vertex_file_path);
std::ifstream vShaderFile(VertexShaderCode.c_str());
std::stringstream vShaderData;
vShaderData << vShaderFile.rdbuf();
vShaderFile.close();

The file is then compiled using

char const *VertexSourcePointer = VertexShaderCode.c_str();
glShaderSource(VertexShaderID, 1, &VertexSourcePointer , NULL);
glCompileShader(VertexShaderID);

How can I efficiently read in the files and avoid these errors?

EDIT:

Correct compile:

const std::string &shaderText = vShaderData.str();
GLint textLength = (GLint)shaderText.size();
const GLchar *pText = static_cast<const GLchar *>(shaderText.c_str());
glShaderSource(VertexShaderID, 1, &pText, &textLength);
glCompileShader(VertexShaderID);
1
Although the compiler error might mean something different, one obvious error is multiplying a mat4 with a vec3, which shouldn't work (unless the newer GLSL versions have radically changed their type conversion rules).Christian Rau
I've since changed that to mat4 viewProj = projection * view; gl_Position = viewProj * vec4(vertexPosition_modelspace, 1); I presume I have the multiplication the correct way around.user1423893

1 Answers

6
votes

VertexShaderCode is your filename, not the shader string. That's still in vShaderData. You need to copy the string out of vShaderData, and feed it into glShaderSource.