我使用OpenGL和GLSL开发了一个小型3D引擎。
这是渲染代码的一部分:
void video::RenderBatch::Render(void)
{
type::EffectPtr pShaderEffect = EffectManager::GetSingleton()
.FindEffectByName(this->m_pMaterial->GetAssocEffectName());
pShaderEffect->Bind();
{
///VERTEX ATTRIBUTES LOCATIONS.
{
pShaderEffect->BindAttribLocation(scene::VERTEX_POSITION, "VertexPosition");
pShaderEffect->BindAttribLocation(scene::VERTEX_TEXTURE, "VertexTexture");
pShaderEffect->BindAttribLocation(scene::VERTEX_NORMAL, "VertexNormal");
}
//SEND MATRIX UNIFORMS.
{
glm::mat3 normalMatrix = glm::mat3(glm::vec3(this->m_ModelViewMatrix[0]),
glm::vec3(this->m_ModelViewMatrix[1]), glm::vec3(this->m_ModelViewMatrix[2]));
pShaderEffect->SetUniform("ModelViewProjMatrix", this->m_ModelViewProjMatrix);
pShaderEffect->SetUniform("ModelViewMatrix", this->m_ModelViewMatrix);
pShaderEffect->SetUniform("NormalMatrix", normalMatrix);
}
this->SendLightUniforms(pShaderEffect); //LIGHT MATERIALS TO BE SENT JUST ONCE */
pShaderEffect->SendMaterialUniforms( //SEND MATERIALS IF CHANGED
this->m_pMaterial->GetName());
this->m_pVertexArray->Lock();
{
this->m_pIndexBuffer->Lock();
{
RenderData renderData = this->GetVisibleGeometryData();
{
glMultiDrawElements(GL_TRIANGLES, (GLsizei*)&renderData.count[0], GL_UNSIGNED_INT,
(const GLvoid **)&renderData.indices[0], renderData.count.size());
}
}
this->m_pIndexBuffer->Unlock();
}
this->m_pVertexArray->Unlock();
}
pShaderEffect->Release();
}
我注意到对函数“ SetUniform”的调用会造成FPS的巨大损失(如果不使用它,则损失超过1000 FPS,如果使用+65 FPS,则损失超过!)。只需简单调用此函数就可以了!
这是函数'this-> SetUniform'的代码(对于矩阵4x4):
void video::IEffectBase::SetUniform(char const *pName, glm::mat4 mat)
{
int location = glGetUniformLocation(this->m_Handle, pName);
if (location >= 0)
glUniformMatrix4fv(location, 1, GL_FALSE, glm::value_ptr(mat));
}
实际上,仅调用函数“ glGetUniformLocation”或函数“ glUniformMatrix4fv”就足以造成这样的FPS损失。通过此功能的唯一调用将1000 FPS提升到65 FPS是正常的吗?但是,缓冲区绑定或着色器程序绑定没有这种效果!(如果我注释所有的“ SetUniform”调用,即使使用所有绑定(状态更改),我仍然拥有超过1000 FPS!)
因此,总的来说,将统一信息发送到着色器程序所需的所有功能(矩阵和材质数据等)似乎都对帧速率产生了巨大影响。但是,在此示例中,我的场景仅由唯一的立方体网格组成!为GPU渲染没什么大不了的!
但是我不认为问题出在GPU上,因为我的程序对它的影响只是可笑的(根据“ GPUShark”):
只有6%!但是,仅显示窗口(不包含几何图形)就足以达到6%!因此,我的多维数据集的渲染对GPU几乎没有影响。所以我认为问题出在CPU / GPU数据传输上……我认为使用这些功能会降低性能是正常的,但是从超过1000 FPS到65 FPS实在是太不可思议了!而只是画一个简单的几何!
有没有一种方法可以使性能更好,或者使用这种发送数据的技术来造成这样的FPS丢失是正常的吗?
您对此有何看法?
非常感谢您的帮助!
不要glGetUniformLocation
每次都需要设置制服的值时打电话。对于给定的着色器,统一位置不会改变(除非重新编译它),因此在编译着色器后查找统一一次,并保存位置值以供您在Render
函数中使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句