Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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
Qt 在OpenGL中通信大型/变化/复杂的顶点集?_Qt_Opengl - Fatal编程技术网

Qt 在OpenGL中通信大型/变化/复杂的顶点集?

Qt 在OpenGL中通信大型/变化/复杂的顶点集?,qt,opengl,Qt,Opengl,我有一个非常基本的场景渲染和顶点和颜色数组(下面的一些代码)。我了解了如何将顶点和颜色绑定到顶点着色器属性。当前,此顶点和颜色信息位于“我的渲染”函数中的一个局部数组变量中,如下所示,然后调用glDrawArrays(GL_三角形,0,n)为每个帧绘制它们 我试图描绘一个更大的移动场景的架构,其中有很多模型和很多需要加载和卸载的垂直 我想象扩展它的天真方式是将所有顶点/颜色数据放在主内存中的一个大数组中,然后为每个帧调用一次glDrawArrays。这对我来说似乎效率低下。在每一帧上,顶点和颜色

我有一个非常基本的场景渲染和顶点和颜色数组(下面的一些代码)。我了解了如何将顶点和颜色绑定到顶点着色器属性。当前,此顶点和颜色信息位于“我的渲染”函数中的一个局部数组变量中,如下所示,然后调用
glDrawArrays(GL_三角形,0,n)
为每个帧绘制它们

我试图描绘一个更大的移动场景的架构,其中有很多模型和很多需要加载和卸载的垂直

我想象扩展它的天真方式是将所有顶点/颜色数据放在主内存中的一个大数组中,然后为每个帧调用一次glDrawArrays。这对我来说似乎效率低下。在每一帧上,顶点和颜色信息只会部分更改,因此为每一帧排列和重新加载整个整体顶点数组似乎是错误的

3D游戏等对此有何作用?它们是否为每个帧将所有顶点放在主内存中的一个大数组中,然后调用一次glDrawArrays?如果没有,他们通常使用什么体系结构和OpenGL调用将场景的所有顶点与GPU进行通信?是否可以将顶点加载到GPU内存中,然后将它们重新用于多个帧?是否可以从主内存中的多个位置绘制多个顶点阵列

static const char *vertexShaderSource =
R"(

    attribute highp vec4 posAttr;
    attribute lowp vec4 colAttr;
    varying lowp vec4 col;
    uniform highp mat4 matrix;

    void main()
    {
       col = colAttr;
       gl_Position = matrix * posAttr;
    }

)";

static const char *fragmentShaderSource =
R"(

    varying lowp vec4 col;

    void main()
    {
       gl_FragColor = col;
    }

)";

void Window::render()
{
    glViewport(0, 0, width(), height());

    glClear(GL_COLOR_BUFFER_BIT);

    m_program->bind();

    constexpr float delta = 0.001;
    if (forward)
        eyepos += QVector3D{0,0,+delta};
    if (backward)
        eyepos += QVector3D{0,0,-delta};
    if (left)
        eyepos += QVector3D{-delta,0,0};
    if (right)
        eyepos += QVector3D{delta,0,0};

    QMatrix4x4 matrix;
    matrix.perspective(60, 4.0/3.0, 0.1, 10000.0);
    matrix.lookAt(eyepos, eyepos+direction, {0, 1, 0});
    matrix.rotate(timer.elapsed() / 100.0f, 0, 1, 0);

    m_program->setUniformValue("matrix", matrix);

    QVector3D vertices[] =
    {
        {0.0f, 0.0f, 0.0f},
        {1.0f, 0.0f, 0.0f},
        {1.0f, 1.0f, 0.0f},
    };

    QVector3D colors[] =
    {
        {1.0f, 0.0f, 0.0f},
        {1.0f, 1.0f, 0.0f},
        {1.0f, 0.0f, 1.0f},
    };

    m_program->setAttributeArray("posAttr", vertices);
    m_program->setAttributeArray("colAttr", colors);

    m_program->enableAttributeArray("posAttr");
    m_program->enableAttributeArray("colAttr");

    glDrawArrays(GL_TRIANGLES, 0, 3);

    m_program->disableAttributeArray("posAttr");
    m_program->disableAttributeArray("colAttr");

    m_program->release();

    ++m_frame;
}

取决于你想如何组织事情

如果您有一个需要移动、旋转和变换但不改变其形状的详细模型,那么一个非常明确的方法是将该模型加载到例如VBO中(我不确定您的
setAttributeArray
做什么),并且这必须只发生在第一帧之前,随后的帧可以通过您想要的任何变换渲染该模型,只需将模型视图矩阵设置为统一,这是通过总线传输的更小的数据块

顶点着色器可以而且应该用于让GPU帮助或完全卸载这些类型操作的计算和/或应用