2012-11-29 9 views
6

Stavo cercando di utilizzare il feedback di trasformazione per recuperare i dati dal vertex shader per il debug, poiché la mia matrice prospettica sembrava essere stata calcolata male. Non ho ottenuto nulla nel buffer di feedback della trasformazione. Qualcuno può aiutarmi a capire quale passo ho fatto di sbagliato?come utilizzare il feedback di trasformazione opengl, ottengo sempre 0 nei buffer

seguito è frammento di mio codice di costituzione trasformare risposte:

//vertex to be passed into shader 
const float vertexPos[] = 
{ 
    0.75f, 0.75f, 0.0f, 1.0f, 
    0.75f, -0.75f, 0.0f, 1.0f, 
    -0.75f, -0.75f, 0.0f, 1.0f 
}; 

//set up transform feedback 
const char *variableName = "retrieve";//the variable to be retreived in shader 
float dateFromShader[16];//receive the data from shader 
GLuint tf_bo;//transform feedback buffer id 

glTransformFeedbackVaryings(shaderProgram, 1, &variableName, GL_INTERLEAVED_ATTRIBS); 
glLinkProgram(shaderProgram); 

glGenBuffers(1, &tf_bo); 
glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, tf_bo);// Is this necessary to call glBindBuffer before glBindBufferBase? 
    glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, tf_bo); 
    glBufferDate(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(float) * 16, NULL, GL_DYNAMIC_COPY); 
glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, 0); 

//retrieve data from vertex shader 
glEnable(GL_RASTERIZER_DICARD); 
glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, tf_bo); 
glBeginTransformFeedback(GL_TRIANGLES); 
    glDrawArrays(GL_TRIANGLES, 0, 3);// 
glEndTransformFeedback(); 

glBindBuffer(GL_ARRAY_BUFFER, tf_bo); 
glGetBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float) * 16, dataFromShader); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 
glDisable(GL_RASTERIZER_DISCARD); 

e il mio vertex shader è così:

#version 420 

layout(location = 0) in vec4 position; 


uniform mat4 perspectiveMatrix; 
out mat4 retrieve; 

void main() 
{ 
gl_Position = perspectiveMatrix * position; 

retrieve = perspectiveMatrix; 
} 
+1

Poiché non ho esperienza con il buffer di feedback trasformazione, posso solo raccomandare di provare a copiare alcuni dei tutorial online come http://ogldev.atspace.co.uk/www/tutorial28/tutorial28.html In secondo luogo, stai controllando gli errori di OpenGl? Potrebbe essere che qualcosa stia andando male ma non lo sai. Usa [glGetError] (http://www.opengl.org/sdk/docs/man/xhtml/glGetError.xml) per farlo. Se restituisce un errore, prova a scoprire quale chiamata lo sta generando spostando la chiamata glGetError in giro. In terzo luogo, questo sembra un modo MOLTO complicato per eseguire il debug della tua matrice prospettica. A far bett – Hannesh

+0

grazie per il vostro consiglio, cercherò di verificare la matrice prespective nel codice dell'applicazione non shader. Penso che avrò bisogno di usare il feedback delle trasformazioni in un secondo momento, quindi è meglio che lo impari per un uso futuro. – Nowibananatzki

risposta

5
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, tf_bo); 

Come indicato in the documentation, glBindBufferBase richiede che l'oggetto del buffer hanno archiviazione dei dati (ad esempio: che hai chiamato glBufferData su di esso). glBindBufferBase non è una sostituzione per glBindBuffer; è un diverso tipo di funzione che ha un uso diverso.

Successivamente, stai acquisendo una matrice. Il problema è che stai disegnando tre vertici, il che significa che stai per acquisire tre vertici. Hai solo assegnato abbastanza spazio per uno. Questo causerà un comportamento indefinito.

La cosa più importante di tutte ... che cosa pensi esattamente che ciò comporterà? Stai acquisendo un valore uniforme hai caricato direttamente. A meno che non crediate che la versione di glUniformMatrix implementata sia in qualche modo rotta, non è molto utile nel debug di qualsiasi cosa.

+0

Grazie per il vostro aiuto. dal risultato della matrice prospettica moltiplicata per vertice che ho fatto manualmente, penso che la mia matrice prospettica sia corretta. Ma perché il mio triangolo era visibile solo quando il valore z trasformato è negativo? poiché [n, f] è mappato a [-1, 1] nello spazio di ritaglio, quindi penso che anche i punti di 0 Nowibananatzki

+0

@CGPhaha: questa è una domanda diversa che non ha nulla a che fare con il rendering del feedback. Dovresti usare il pulsante "Chiedi domanda" per chiederlo. –

Problemi correlati