OpenGL Shader Erreurs de Compilation: unexpected $indéfini au jeton “<undefined>”
J'ai vu cette question et c'est vraiment shedded un peu de lumière. Malgré cela, je n'arrive pas à comprendre comment je suis "mal" chargement de mon shader, parce que ce a exécutée avant sans les changements récents à la shader code de chargement, donc je suppose que ces erreurs doivent être à venir à partir de mon tirage appels.
En dépit de cela, je vais tout de même poster le shader fichiers pour des raisons de concision, le tirage au sort de la fonction utilisée pour tracer le cercle, je suis en train de calcul, et le code qui charge dans le fichier shader comme une chaîne de caractères.
Fondamentalement, ce que j'ai besoin de savoir, c'est pourquoi j'obtiens ces erreurs et ce que l'enfer est le problème avec eux?
(De la sortie de débogage)
ERROR {
OpenGL Says:
Vertex info
-----------
0(1) : error C0000: syntax error, unexpected $undefined at token "<undefined>"
Fragment info
-------------
0(1) : error C0000: syntax error, unexpected $undefined at token "<undefined>"
};
Tirage Code
void Circle::draw( GLuint program )
{
const size_t centerMag = mCenter.length();
glUseProgram( program );
for( float t = 0; t < mCircumference; t += 0.1 )
{
float x = centerMag + glm::cos( 2 * M_PI * t );
float y = centerMag + glm::sin( 2 * M_PI * t );
mVertices->push_back( glm::vec4( x, y, 0, 1 ) );
}
QListIterator< glm::vec4 > iVertices( *mVertices );
const size_t size = mVertices->size();
float** verts = new float*[ size ];
size_t i = 0;
glEnableClientState( GL_VERTEX_ARRAY );
while( iVertices.hasNext() )
{
verts[ i ] = new float[ size ];
verts[ i ] = const_cast< float* >( glm::value_ptr( iVertices.next() ) );
glVertexPointer( 4, GL_FLOAT, 0, verts[ i ] );
glDrawArrays( GL_LINES, 0, 4 );
++i;
}
glDisableClientState( GL_VERTEX_ARRAY );
for( unsigned iMem = 0; iMem < size; ++iMem )
{
delete[] verts[ iMem ];
verts[ iMem ] = NULL;
}
delete[] verts;
verts = NULL;
}
FileUtility
QString FileUtility::readShader( QString filepath )
{
std::ifstream in( filepath.toStdString().c_str() );
std::stringstream shaderDat;
shaderDat << in.rdbuf();
QString shaderFile;
shaderFile += shaderDat.str().c_str();
in.close();
return shaderFile;
}
GenericColor.frag
#version 330
out vec4 outputColor;
void main()
{
outputColor = vec4(1.0f, 0, 0, 1.0f);
}
Position.vert
#version 330
layout(location = 0) in vec4 position;
void main()
{
gl_Position = position;
}
Mise à jour
Depuis mon shader de liaison/de la compilation de code a été demandé, j'ai pensé que je peut tout aussi bien poster mon shader gestionnaire, ainsi que le moteur de la classe.
Mise à jour
Voici le shader chaînes analysées (Info
est une sortie de débogage):
Info {
Shader Source #version 330
in uniform mvp;
layout(location = 0) in vec4 position;
void main()
{
gl_ModelViewProjectionMatrix = mvp;
gl_Position = position;
}
};
Info {
Shader Source #version 330
out vec4 outputColor;
void main()
{
outputColor = vec4(1.0f, 0, 0, 1.0f);
}
};
Mise à jour, j'ai décidé de pastebin le fichier source en entier.
Merci, je vais jeter un oeil.
Toute chance vous pourriez publier l'exacte c_str qui se sont chargés de glShaderSource? Shader erreurs de compilation ne devrait pas avoir quelque chose à voir avec le reste du programme (votre tirage de code il n'y a probablement pas d'importance). Peut-être pouvait voir quelque chose de cette façon.
Yup, juste mis à jour. Je me demande si le problème, c'est parce que je suis en utilisant Qt, bien que pour cette...
OriginalL'auteur zeboidlund | 2012-06-04
Vous devez vous connecter pour publier un commentaire.
Ce message d'erreur signifie que le shader compilateur, c'est de voir une poubelle personnage (autre chose qu'une version imprimable des caractères ASCII, un espace, une tabulation ou un retour à la ligne) sur la première ligne de l'ombrage. Ce qui veut probablement dire que la chaîne que vous êtes de passage à
glShaderSource
est des ordures, probablement un bancales pointeur qui a dit une fois à votre code du shader, mais n'est plus à cause de quelque chose de l'été détruits.modifier
Je vois à partir de votre lien, vous disposez d'un code qui ressemble à ceci:
Qui sera mis en
s.Source
pointant vers la mémoire tampon interne de temporairestd::string
objet qui sera détruite peu de temps après cette ligne, en laissants.Source
balançant un pointeur...Une autre note de cas: Ce qui s'est passé avec moi aussi, mais avec manquant \0 terminator à la fin, donc je suis en ajoutant ceci à votre déclaration en disant: "sur la première ligne du shader".
Manque un NUL sera généralement vous donner de l'erreur sur le dernier ligne de le shader plutôt que la première. Le nombre entre parenthèses au début du message d'erreur est le numéro de la ligne (Le nombre de chiffres avant la parenthèse est l'index dans le tableau passé à glShaderSource)
OriginalL'auteur Chris Dodd
Mon avis: j'ai vu le glLoadMatrix() appelle dans votre code, ce qui signifie que vous utilisez une ancienne (pré-3.1) GL API et de ne pas initialiser la GL3.1 Profil du Noyau contexte correctement.
Cela conduit à la situation où votre contexte ne prend pas en charge la GLSL1.50+ et la "localisation" des attributs (ainsi, l'erreur de shader compilateur).
Essayez de changer l'initialisation de la GL et de vérifier ensuite la glBindAttribLocation appels. Évitez d'utiliser le glLoadMatrix trucs - utilisation de shaders uniformes à la place.
Regarder opengl.org's site: http://www.opengl.org/wiki/Tutorial:_OpenGL_3.1_The_First_Triangle_(C%2B%2B/Win) pour un GL 3.1 le contexte de la création de l'échantillon. C'est un peu différente de GL2.0-
OriginalL'auteur Viktor Latypov
Ce n'est probablement pas lié à votre problème actuel, mais il sera bientôt assez :
La mémoire allouée dans la première ligne de fuite, en outre, lorsque vous appelez
delete
quelques lignes après, vous êtes à la suppression de la valeur donnée parnew
mais le coulé. C'est ce que tu veux dire ?OriginalL'auteur rotoglup
J'ai eu cette erreur parce que j'ai coupé, et collez code du shader à partir d'un site web. Je suppose que la différence de LF/CR a été à l'origine du problème. Retrait du texte collé avec le même code écrit manuellement travaillé.
OriginalL'auteur Archon 808