【问题标题】:Full setup of Transform Feedback(openGL)变换反馈的完整设置(openGL)
【发布时间】:2011-02-11 15:36:56
【问题描述】:

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
}

着色器: 垂直

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

碎片

#version 150 core
varying vec3 sp;

void main (void)
{
    vec3 c = sp;
    gl_FragColor = vec4(c,1.0);
}

片段着色器仅用于 GLSL 优化。如果不使用 sp,GLSL 会清除它。 可能存在一些小错误,因为我从包含多个变量的更大代码中提取了这些错误也失败了。

【问题讨论】:

  • 你能发布着色器类的实现吗?另外,请告诉我们您在哪个平台上运行以及驱动程序版本是什么。
  • 我可以请你重复实验,但程序没有附加片段着色器(只有顶点着色器)?不用担心sp 值会被 GLSL 编译器优化掉——不会的(我有大量没有附加任何 FP 组件的 TF 着色器)。
  • 嗯,我想我真的可以从那一点开始,因为那个样本包让一切变得简单易行。但我不能要求别人帮助我,所以着色器类将在编辑中,我在 Windows 7 上运行,ATI radeon 3870HD。 Catalyst Control Center 10.6 与 openGL 版本 6.14.10.9901(3.3 左右)。将片段着色器清除为“void main(){}”会产生相同的错误。从加载中排除着色器会产生相同的错误..

标签: c++ opengl glsl shader feedback


【解决方案1】:

看看OpenGL Samples Pack。您可能对 ogl-330-transform-feedback.cpp 和 ogl-400-transform-feedback-object.cpp 感兴趣。您甚至可以检查 January 2011 OpenGL drivers status 最新驱动程序是否对提供的示例有任何问题。

祝你好运。

【讨论】:

  • 似乎这些样本最终可以引导我走出黑暗 :D 是的,它们正是我所需要的。不过需要重建我的应用程序,所以我希望它最终能正常工作。我注意到他们将相同的缓冲区对象绑定为 vertexArray 和 feedbackBuffer.. 从那时起他们必须指定指针.. 应该是它
【解决方案2】:

Daniel Rakos 有一个带有源代码的演示,使用 OpenGL 上的变换反馈实现实例剔除。看看它可能会有所帮助:

http://rastergrid.com/blog/2010/02/instance-culling-using-geometry-shaders/

【讨论】:

  • 1.不错的程序,现在我知道我的问题与驱动程序/卡无关,并且还有一个源代码.. 嗯很好吃.. 2.(仅供参考)他以 6-7 帧运行,我在 70-210 帧运行。 . 哈哈,这只是一个系列的区别:D
【解决方案3】:

您可能想查看 Ogre 3D: http://www.ogre3d.org/forums/viewtopic.php?p=299736

他们似乎有一个转换反馈的有效实现。

【讨论】:

  • 嗯,这就像在一堆中寻找针,但在有人发布更好的东西之前,我会尝试通过它。我想我知道从哪里开始,但是 ogre 是个大引擎,其他代码中可能隐藏了一些初始化。感谢您的快速回答! :)
  • 好吧,挖进去发现了一些东西。我交换了调用的顺序,但它仍然在 glBeginTranformFeedback 和 glEndTransformFeedback 上给出错误。除了他们使用他们的大接口之外,第一个区别是他们仍在使用 NV 扩展,但我在 ATI 上运行并且他们使用交错阵列,但我需要分开。无论如何它不应该写那些错误所以出了点问题。
【解决方案4】:

我也遇到过glBeginTransformFeedback产生“无效操作”的类似问题。从Orhun提供的包中读取文件“gl-440-transform-feedback.cpp”中的源代码后,我发现添加

glEnable(GL_RASTERIZER_DISCARD);

glBeginTransformFeedback() 之前的电话只是解决了问题。

希望这能有所帮助。

【讨论】:

猜你喜欢
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多