GLSL 1.50,openGL 3.3。
我最近一直试图让我的转换反馈工作但没有成功。我仍然在glBeginTranformFeedback()之后收到错误,因为我没有找到任何完整的工作代码,我已经将我的知识与我找到的一些代码和文档叠加起来,它现在应该运行良好,但我遗漏了一些东西。因此,如果任何人获得完整的代码(初始化缓冲区,设置,更新,渲染,回读),它将定义帮助,如果你不知道发生了什么,你可以看看我的代码。我排除了一些基准测试,处理窗口及其创建:
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
}
着色器: 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);
}
片段着色器仅适用于GLSL优化。如果不使用sp,GLSL会清除它。 可能存在一些小错误,因为我从更大的代码中提取了这个错误,但多个变化也失败了。
答案 0 :(得分:4)
看看OpenGL Samples Pack。您可能对ogl-330-transform-feedback.cpp和ogl-400-transform-feedback-object.cpp感兴趣。您甚至可以检查January 2011 OpenGL drivers status最新驱动程序是否与提供的示例有任何问题。
祝你好运。答案 1 :(得分:1)
Daniel Rakos有一个包含源代码的演示,使用OpenGL上的变换反馈实现实例剔除。它可能有助于查看它:
http://rastergrid.com/blog/2010/02/instance-culling-using-geometry-shaders/
答案 2 :(得分:0)
您可能需要查看Ogre 3D: http://www.ogre3d.org/forums/viewtopic.php?p=299736
他们似乎有一个转换反馈的工作实现。
答案 3 :(得分:0)
我也遇到过glBeginTransformFeedback
生成“无效操作”的类似问题。在我从Orhun提供的包中读取文件“gl-440-transform-feedback.cpp”中的源代码后,我发现添加了
glEnable(GL_RASTERIZER_DISCARD);
在glBeginTransformFeedback()
来电之前解决问题。
希望这可以提供帮助。