2012-06-04 8 views
10

Ho visto la domanda this e ha davvero fatto luce. Nonostante questo, non riesco a capire come sto "impropriamente" caricare la mia dello shader, perché questo ha eseguita prima senza alcuna recenti modifiche al codice dello shader di carico, in modo da assumere questi errori devono essere provenienti dal mio sorteggio chiamate.

Nonostante ciò, inserirò ancora i file dello shader per brevità, la funzione di disegno utilizzata per disegnare il cerchio che sto cercando di rendere e il codice che carica nel file shader come una stringa.

Fondamentalmente quello che dovete sapere è perché sto ottenendo questi errori e cosa diavolo è sbagliato con loro?

(Da output di debug)

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>" 

}; 

Codice Draw

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; 
} 

Aggiornamento

Dal momento che il mio legame Shader/codice di compilazione è stato richiesto, ho pensato che può anche semplicemente pubblicare la mia intero gestore dello shader, così come la classe del motore.

- Engine - ShaderHandler.

Aggiornamento

Qui ci sono le corde degli shader analizzati (Info è un output di debug):

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); 
} 


}; 
+0

È possibile visualizzare anche la compilazione shader/codice vincolante VA? –

+0

Aggiornato, ho deciso di incollare l'intero file sorgente. – zeboidlund

+0

Grazie, darò un'occhiata. –

risposta

17

Questo messaggio di errore indica che il compilatore dello shader sta visualizzando un carattere illeggibile (qualcosa di diverso da un carattere ASCII stampabile, uno spazio, una scheda o una nuova riga) sulla prima riga dello shader. Il che probabilmente significa che la stringa che stai passando a glShaderSource è spazzatura, probabilmente un puntatore pendente che una volta puntava al codice dello shader, ma non lo fa più a causa di qualcosa che viene distrutto.

modificare

vedo dal tuo link si dispone di codice che assomiglia:

s.Source = shader.toStdString().c_str(); 

che fisserà s.Source indicando il buffer interno di un std::string oggetto temporaneo che verrà distrutto poco dopo questa linea, lasciando s.Source un puntatore penzolante ...

+0

GRAZIE. Dio, a volte odio il fatto che io sia venuto da uno sfondo in C#. – zeboidlund

+0

Un'altra nota del caso: è successo anche a me, ma con ** terminatore \ 0 mancante alla fine **, quindi aggiungo questo alla tua affermazione dicendo ** "sulla prima riga dello shader" **. – Wappenull

+0

@Wappenull: Un NUL mancante generalmente ti darà quell'errore sull'ultima riga * dello shader piuttosto che sul primo. Il numero tra parentesi all'inizio del messaggio di errore è il numero di riga (il numero prima del paren è l'indice nell'array passato a glShaderSource) –

2

la mia ipotesi: ho visto il glLoadMatrix() chiama nel codice che in pratica significa si sta utilizzando un'API GL obsoleta (precedente alla 3.1) e non si inizializza correttamente il contesto del profilo principale GL3.1.

Questo porta alla situazione in cui il vostro contesto non supporta il GLSL1.50 + e la "location" attributi (così l'errore dal compilatore di ombreggiature).

provare a cambiare l'inizializzazione di GL e quindi controllare il glBindAttribLocation chiamate. Evita di usare il materiale glLoadMatrix - usa invece le uniformi shader.

un'occhiata al sito di opengl.org: http://www.opengl.org/wiki/Tutorial:_OpenGL_3.1_The_First_Triangle_(C%2B%2B/Win) per un campione creazione contesto GL 3.1. È un po 'diverso da GL2.0-

1

Questo non è probabilmente legato al vostro problema attuale, ma sarà uno abbastanza presto:

verts[ i ] = new float[ size ]; 
verts[ i ] = const_cast< float* >(glm::value_ptr(iVertices.next())); 

La memoria allocata nella prima riga è trapelato, inoltre, quando si chiama delete poche righe dopo , stai cancellando il valore dato da new ma quello lanciato. È questo che vuoi dire ?

1

Ho ricevuto questo errore perché ho tagliato e incollato un codice shader da un sito web. Presumo che la differenza in LF/CR stava causando il problema. Rimozione del testo incollato con lo stesso codice digitato manualmente lavorato.

Problemi correlati