Проблема компиляции шейдера glsl во время выполнения

Я работаю над проектом, в котором используются шейдеры OpenGL 4.0.

Я должен передать вызов glShaderSource () с массивом массивов символов, который представляет источник шейдера.

Сбой компиляции шейдера со следующими ошибками:

(0) : error C0206: invalid token "" in version line
(0) : error C0000: syntax error, unexpected $end at token ""

Вот мой (привет, мир) шейдер - прямо из кулинарной книги языка шейдеров OpenGL 4.0

#version 400

in  vec3        VertexPosition;
in  vec3        VertexColor;
out vec3        Color;

void main()
{
    Color       = VertexColor;
    gl_Position = vec4( VertexColor, 1.0 );
}

А вот мой код для чтения файла шейдера в мой код C ++, и скомпилировать шейдер во время выполнения:

const int       nMaxLineSize    = 1024;
char            sLineBuffer[nMaxLineSize];
ifstream        stream;
vector  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 );

Код C ++ выполняется, как ожидалось, но компиляция шейдера не выполняется. Может ли кто-нибудь заметить, что я делаю неправильно?

У меня такое чувство, что это может быть связано с символами конца строки, но поскольку это моя первая попытка компиляции шейдеров, я застрял!

Я читал другие ответы SO по компиляции шейдеров, но они кажутся специфичными для Java / других языков, а не для C ++. Если это поможет, я использую платформу win32.

5
задан 6 November 2011 в 00:41
поделиться