GLSL 1.50, openGL 3.3.Configuración completa de Transform Feedback (openGL)
Últimamente trato de que mi retroalimentación de tranform funcione, pero sin éxito. Todavía recibo un error después de glBeginTranformFeedback() y como no he encontrado ningún código de trabajo completo, he acumulado mi conocimiento con algún código que encontré y documentación, pero debería estar funcionando bien pero me falta algo. Por lo tanto, si alguien obtiene el código completo (inicialización de almacenamientos intermedios, configuración, actualización, representación, lectura de nuevo), la ayuda sería definitiva y, si no sabe qué ocurre, podría consultar mi código. Excluí alguna evaluación comparativa, el manejo de las ventanas y de la creación:
int main()
{
bool fullsize = false, paused = false;
std::string caption = "Tester";
GLuint dataVAO,speedUpdateVBO,dataVBO;
std::vector<vector3f> dataW;
// Create the main rendering window
init(); //just some camera commands
UniShader shader; //my shader class keeps everything together
shader.init();
shader.addShader("test.vert");
shader.addShader("test.frag");
shader.newAttributeVariable("speed");
shader.newFeedbackVarying("sp");
shader.linkShader();
shader.use();
//init some data
dataW.push_back(vector3f(0,1,0));
//creating VAO
glGenVertexArrays(1,&dataVAO);
glBindVertexArray(dataVAO);
//creating VBO
glGenBuffers(1,&dataVBO);
glBindBuffer(GL_ARRAY_BUFFER,dataVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vector3f), 0, GL_DYNAMIC_DRAW);
glVertexAttribPointer(shader.getAttributeIndex("speed"), 3, GL_FLOAT, GL_FALSE, 0, 0);
glGenBuffers(1, &speedUpdateVBO);
glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, speedUpdateVBO);
glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(vector3f), NULL, GL_DYNAMIC_COPY);
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, speedUpdateVBO);
glBindVertexArray(0);
while (App.IsOpened())
{
App.SetActive();
benchP = Clock.GetElapsedTime();
//update calls
if(!paused)
//update
benchU = Clock.GetElapsedTime();
//render calls
glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(0.6f,0.7f,0.7f);
GLuint query;
GLuint count = 0;
glGenQueries(1, &query);
glEnableVertexAttribArray(shader.getAttributeIndex("speed"));
glBindVertexArray(dataVAO);
glBindBuffer(GL_ARRAY_BUFFER,dataVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vector3f)*dataW.size(), &dataW[0], GL_DYNAMIC_DRAW);
glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, speedUpdateVBO);
glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(vector3f)*dataW.size(), NULL, GL_DYNAMIC_COPY);
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, speedUpdateVBO);
glEnable(GL_RASTERIZER_DISCARD);
glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, query);
printOglError(); //Until this everything OK, I think
glBeginTransformFeedback(GL_POINTS);
printOglError(); //This one prints out Invalid Value
glDrawArrays(GL_POINTS,0,dataW.size());
glEndTransformFeedback();
glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
glDisable(GL_RASTERIZER_DISCARD);
//retrieve updated data
glGetQueryObjectuiv(query, GL_QUERY_RESULT, &count); //count is 0 -> nothing happend
glBindVertexArray(0);
glDisableVertexAttribArray(shader.getAttributeIndex("speed"));
glDeleteQueries(1, &query);
App.Display();
//some other benchmark stuff
}
shaders: vert
#version 150 core
in vec3 speed;
varying vec3 sp;
const float gravity_constant = 9.81f;
void main(){
sp = speed;
sp += vec3(0,-gravity_constant,0);
}
frag
#version 150 core
varying vec3 sp;
void main (void)
{
vec3 c = sp;
gl_FragColor = vec4(c,1.0);
}
Fragmento de sombreado está allí sólo para Optimización GLSL. Si sp no se utilizara, GLSL lo aclararía. Puede haber algunos errores menores ya que extraje esto de un código mucho más grande con múltiples variaciones que también falla.
¿Se puede publicar la implementación de la clase shader? Además, díganos en qué plataforma se está ejecutando y cuál es la versión del controlador. – kvark
¿Puedo pedirle que repita el experimento, pero sin sombreador de fragmentos adjunto al programa (solo el vértice uno)? No se preocupe porque el compilador GLSL optimice el valor 'sp', no lo será (tengo toneladas de sombreadores TF sin ningún componente FP adjunto). – kvark
Bueno, creo que realmente puedo tomarlo desde ese punto, ya que el paquete de muestra lo tiene todo simple y fácil. Pero no puedo pedir más de lo que alguien me está ayudando, así que la clase de sombreado estará en edición, estoy ejecutando en Windows 7, ATI Radeon 3870HD. Catalyst Control Center 10.6 con OpenGL versión 6.14.10.9901 (algo alrededor de 3.3). Borrar el sombreador de fragmentos a "void main() {}" da el mismo error. Si se excluye el sombreado de la carga, se obtiene el mismo error. – Raven