完全设置Transform Feedback(openGL) [英] Full setup of Transform Feedback(openGL)

查看:777
本文介绍了完全设置Transform Feedback(openGL)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

GLSL 1.50,openGL 3.3。

GLSL 1.50, openGL 3.3.

我最近试图让我的tranform反馈工作,但没有成功。我仍然收到错误后glBeginTranformFeedback()和我还没有找到任何完整的工作代码我已经堆积了我的知识与一些代码,我发现和文档,它应该工作很好,现在,但我缺少的东西。所以如果有人得到完整的代码(初始化缓冲区,设置,更新,渲染,回读),它会明确帮助,如果你不知道发生了什么,你可以看看我的代码。我排除了一些基准,处理窗口和它的创作:

I've been lately trying to get my tranform feedback working but without success. I still receive error after glBeginTranformFeedback() and as I haven't found any full working code I have stacked up my knowledge with some code that I found and documentation, it should be working well by now but I am missing something. So if anybody got full code (initializing of buffers, setting up, updating, rendering, reading back) it would definitelly help and if you don't but know what's going on you could take look at my code. I excluded some benchmarking, handling of windows and it's creation:

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

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

片段着色器仅用于GLSL优化。如果sp不会被使用GLSL会清除它。

Fragment shader is there just for GLSL optimalization. If sp wouldn't be used GLSL would clear it up. There may be some minor bugs as I extracted this from much larger code with multiple varyings that fails aswell.

推荐答案

祝你好运。

这篇关于完全设置Transform Feedback(openGL)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆