Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 转换反馈的完整设置(openGL)_C++_Opengl_Glsl_Shader_Feedback - Fatal编程技术网

C++ 转换反馈的完整设置(openGL)

C++ 转换反馈的完整设置(openGL),c++,opengl,glsl,shader,feedback,C++,Opengl,Glsl,Shader,Feedback,GLSL 1.50,openGL 3.3 我最近一直试图让我的转换反馈工作,但没有成功。在glbeginterformfeedback()之后,我仍然收到错误消息,因为我还没有找到任何完整的工作代码,我已经用我找到的一些代码和文档积累了我的知识,它现在应该工作得很好,但我遗漏了一些东西。所以,如果有人得到完整的代码(初始化缓冲区、设置、更新、渲染、读回),这肯定会有帮助,如果你不知道发生了什么,你可以看看我的代码。我排除了一些基准测试、windows处理及其创建: int main() {

GLSL 1.50,openGL 3.3

我最近一直试图让我的转换反馈工作,但没有成功。在glbeginterformfeedback()之后,我仍然收到错误消息,因为我还没有找到任何完整的工作代码,我已经用我找到的一些代码和文档积累了我的知识,它现在应该工作得很好,但我遗漏了一些东西。所以,如果有人得到完整的代码(初始化缓冲区、设置、更新、渲染、读回),这肯定会有帮助,如果你不知道发生了什么,你可以看看我的代码。我排除了一些基准测试、windows处理及其创建:

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
}
碎片

片段着色器仅用于GLSL优化。如果sp不被使用,GLSL会将其清除。
当我从更大的代码中提取这些代码时,可能会出现一些小错误,多个变量也会失败。

您可能想查看Ogre 3D:

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

看看。您可能对ogl-330-transform-feedback.cpp和ogl-400-transform-feedback-object.cpp感兴趣。您甚至可以通过提供的示例检查最新的驱动程序是否存在任何问题


祝你好运。

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


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

glEnable(GL_RASTERIZER_DISCARD);
before
glBeginTransformFeedback()
调用正好解决了这个问题


希望这能有所帮助。

嗯,这就像是一堆搜索针,但在有人发布更好的东西之前,我会尝试浏览一下。我想我知道从哪里开始,但食人魔是一个巨大的引擎,在其他代码中可能隐藏着一些初始化。谢谢你的快速回答!:)好的,挖进去,发现了一些东西。我交换了呼叫顺序,但它仍然在GLBEGInternFormFeedback和GlendTransfermFeedback上给出错误。除了使用大型接口之外,他们的第一个区别是,他们仍然使用NV扩展,但我在ATI上运行,他们使用交错阵列,但我需要单独的接口。无论如何它都不应该写这些错误,所以有些地方出了问题。你能发布着色器类的实现吗?另外,请告诉我们您运行的是什么平台,驱动程序的版本是什么。我可以要求您重复这个实验,但程序没有附加碎片着色器(只有顶点着色器)?不要担心GLSL编译器优化了
sp
值-不会的(我有很多TF着色器,没有附加任何FP组件)。我想我真的可以从这一点开始,因为这个示例包让一切变得简单和容易。但我不能要求更多的人帮助我,所以,着色器类将在编辑,我在Windows7,ATI radeon 3870HD上运行。Catalyst Control Center 10.6和openGL版本6.14.10.9901(3.3左右)。将片段着色器清除为“void main(){}”会产生相同的错误。从加载中排除着色器也会产生同样的错误。看起来这些示例最终可以引导我走出黑暗:D是的,它们正是我所需要的。需要重新构建我的应用程序一点,所以我希望它最终能工作。我注意到它们绑定的缓冲区对象与vertexArray和feedbackBuffer相同。。从这一点开始,他们必须指定指针。。应该是这样的。很好的程序,现在我知道我的问题与驱动程序/卡无关,还有一个源代码。。嗯,很好吃。。2.(仅供参考)他以6-7帧的速度奔跑,我以70-210帧的速度奔跑。。哈哈,这只是一个系列的区别:DI不必在我的解决方案中使用它,但我很高兴它有帮助。如果您想查看,它是我的着色器库的一部分:。请注意,这是针对OpenGL 3.3开发的
#version 150 core
varying vec3 sp;

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