Я работаю над проектом, в котором используются шейдеры OpenGL 4.0.
Я должен предоставить вызов glShaderSource () с массивом массивов символов, который представляет источникшейдер.
Компиляция шейдера не удалась со следующими ошибками:
(0) : error C0206: invalid token "<null atom>" in version line
(0) : error C0000: syntax error, unexpected $end at token "<EOF>"
Вот мой (привет мир) шейдер - прямо из кулинарной книги 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<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 );
Код C ++ выполняется должным образом, но компиляция шейдера не удалась.Кто-нибудь может определить, что я могу делать неправильно?
У меня такое ощущение, что это может быть как-то связано с символами конца строки, но так как это моя первая попытка компиляции шейдеров, я застрял!
Я читал другиеТАК ответы на компиляцию шейдеров, но они кажутся специфичными для Java / других языков, а не C ++.Если это поможет, я на платформе win32.