C++ OpenGL Transform Feedback schreibt keine Daten

MrGameDev

Newbie
Registriert
Dez. 2012
Beiträge
4
Hallo zusammen,

ich habe das Problem, dass bei meinem Programm Transform-Feedback nicht funktioniert. Mit AMD's CodeXL konnte ich herausfinden, dass beim Transform-Feedback keine Daten in den Transform-Feedback-Buffer geschrieben werden. Am Geometry-Shader sollte es nicht liegen, da die Query die korrekte Anzahl an Primitven ermittelt (auch wenn ich den Shader verändere).

Hier der Quellcode
Code:
glUseProgram(m_constructionProgram);

GLuint query;
glGenQueries(1, &query);

// Perform transform feedback
glEnable(GL_RASTERIZER_DISCARD);

glBindBuffer(GL_ARRAY_BUFFER, m_vbo[0]);
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, m_vbo[1]);

glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, query);
glBeginTransformFeedback(GL_TRIANGLES); //writes to transform_feedback_buffer
glDrawArrays(GL_TRIANGLES, 0, m_vertexCount); //takes input from array buffer
glEndTransformFeedback();
glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);

//swap vbo and tbo (vertex_buffer gets generated data from feedback_buffer)
std::swap(m_vbo[0], m_vbo[1]);

// Fetch and print results
GLuint primitiveCount;
glGetQueryObjectuiv(query, GL_QUERY_RESULT, &primitiveCount);

m_vertexCount = primitiveCount * 3;

glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, 0); //unbind
glDisable(GL_RASTERIZER_DISCARD);

Vielen Dank,
MrGameDev
 
Mit Transform Feedback habe ich ehrlich gesagt noch nicht gearbeitet, aber wie sieht denn der Geometry Shader aus und wie setzt du die Parameter fürs Transform Feedback? Möglicherweise passiert da irgendwo Blödsinn.
 
Mit Transform Feedback habe ich ehrlich gesagt noch nicht gearbeitet, aber wie sieht denn der Geometry Shader aus und wie setzt du die Parameter fürs Transform Feedback? Möglicherweise passiert da irgendwo Blödsinn.

Das kann ich mir eigentlich nicht vorstellen, aber man weiß ja nie :)

Vertex Shader:
Code:
in vec3 constrPosition;
in vec3 constrNormal;
in float constrLength;

out vec3 vNormal;
out float vLength;

void main() 
{
	gl_Position = vec4(constrPosition, 1.0);
	vNormal = constrNormal;
	vLength = constrLength;
}
Geometry Shader:
Code:
#version 430

layout(triangles) in;
layout(triangle_strip, max_vertices = 1024) out;

in vec3 vNormal[];
in float vLength[];

out vec3 outPos;
out vec3 outNormal;
out float outLength;

void main()
{
	for (int i = 0; i < gl_in.length(); i++)
	{
              ...
              EmitVertex();
              ...
        }
}

Attribute:
Code:
m_constrPosAttrib = glGetAttribLocation(m_constructionProgram, "constrPosition");
glVertexAttribPointer(m_constrPosAttrib, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(float), 0);
glEnableVertexAttribArray(m_constrPosAttrib);

m_constrNormalAttrib = glGetAttribLocation(m_constructionProgram, "constrNormal");
glVertexAttribPointer(m_constrNormalAttrib, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(float), (void*)(3 * sizeof(float)));
glEnableVertexAttribArray(m_constrNormalAttrib);

m_constrLengthAttrib = glGetAttribLocation(m_constructionProgram, "constrLength");
glVertexAttribPointer(m_constrLengthAttrib, 1, GL_FLOAT, GL_FALSE, 7 * sizeof(float), (void*)(6 * sizeof(float)));
glEnableVertexAttribArray(m_constrLengthAttrib);

Transform Feedback Varyings:
Code:
const GLchar* feedbackVaryings[] = { "outPos", "outNormal", "outLength" };
glTransformFeedbackVaryings(m_constructionProgram, 3, feedbackVaryings, GL_INTERLEAVED_ATTRIBS);

Hast du auch Speicher für deinen Transform-Feedback-Buffer alloziert?

Ja, habe ich

Code:
glGenBuffers(2, m_vbo);

// render buffer
glBindBuffer(GL_ARRAY_BUFFER, m_vbo[0]);
glBufferData(GL_ARRAY_BUFFER, 1024 * 1024, nullptr, GL_STATIC_DRAW); 
glBufferSubData(GL_ARRAY_BUFFER, 0, m_vertexCount * 7 * sizeof(GLfloat), vertices);
glBindBuffer(GL_ARRAY_BUFFER, 0); //unbind

//construction buffer (transform feedback)
glBindBuffer(GL_ARRAY_BUFFER, m_vbo[1]);
glBufferData(GL_ARRAY_BUFFER, 1024 * 1024, nullptr, GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); //unbind
 
Guten Morgen,

ich habe den Fehler gefunden, max_vertices = 1024 war wohl etwas zu hoch gegriffen.
Trotzdem danke für eure Hilfe, ohne diese hätte ich den Geometry Shader wahrscheinlich nicht so schnell verdächtigt :)

Gruß,
MrGameDev
 
Zurück
Oben