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帮助或完全卸载这些类型操作的计算和/或应用