I'm working on a project that uses OpenGL 4.0 shaders.
I have to supply the call to glShaderSource() with an array of char arrays, which represents the source of the shader.
The shader compilation is failing, with the following errors:
(0) : error C0206: invalid token "<null atom>" in version line (0) : error C0000: syntax error, unexpected $end at token "<EOF>" Here's my (hello world) shader - straight from OpenGL 4.0 shading language cookbook
#version 400 in vec3 VertexPosition; in vec3 VertexColor; out vec3 Color; void main() { Color = VertexColor; gl_Position = vec4( VertexColor, 1.0 ); } And here's my code to read the shader file into my C++ code, and compile the shader at runtime:
const int nMaxLineSize = 1024; char sLineBuffer[nMaxLineSize]; ifstream stream; vector<string> vsLines; GLchar** ppSrc; GLint* pnSrcLineLen; int nNumLines; stream.open( m_sShaderFile.c_str(), std::ios::in ); while( (stream.good()) && (stream.getline(sLineBuffer, nMaxLineSize)) ) { if( strlen(sLineBuffer) > 0 ) vsLines.push_back( string(sLineBuffer) ); } stream.close(); nNumLines = vsLines.size(); pnSrcLineLen = new GLint[nNumLines]; ppSrc = new GLchar*[nNumLines]; for( int n = 0; n < nNumLines; n ++ ) { string & sLine = vsLines.at(n); int nLineLen = sLine.length(); char * pNext = new char[nLineLen+1]; memcpy( (void*)pNext, sLine.c_str(), nLineLen ); pNext[nLineLen] = '\0'; ppSrc[n] = pNext; pnSrcLineLen[n] = nLineLen+1; } vsLines.clear(); // just for debugging purposes (lines print out just fine..) for( int n = 0; n < nNumLines; n ++ ) ATLTRACE( "line %d: %s\r\n", n, ppSrc[n] ); // Create the shader m_nShaderId = glCreateShader( m_nShaderType ); // Compile the shader glShaderSource( m_nShaderId, nNumLines, (const GLchar**)ppSrc, (GLint*) pnSrcLineLen ); glCompileShader( m_nShaderId ); // Determine compile status GLint nResult = GL_FALSE; glGetShaderiv( m_nShaderId, GL_COMPILE_STATUS, &nResult ); The C++ code executes as expected, but the shader compilation fails. Can anyone spot what I might be doing wrong?
I have a feeling that this may be to do with end of line characters somehow, but as this is my first attempt at shader compilation, I'm stuck!
I've read other SO answers on shader compilation, but they seem specific to Java / other languages, not C++. If it helps, I'm on the win32 platform.