对使用OpenGL和GLSL的性能的简单好奇

用户名

我使用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用OpenGL和GLSL的SSAO算法的奇怪性能行为

来自分类Dev

使用OpenGL和GLSL的具有简单硬阴影映射技术的小工件

来自分类Dev

关于OpenGL VBO分配的简单好奇

来自分类Dev

使用OpenGL和GLSL,Parralax映射无法正常工作

来自分类Dev

使用OpenGL和GLSL的模板缓冲和延迟渲染

来自分类Dev

使用glTexBuffer和texelFetch的OpenGL(带有GLSL)

来自分类Dev

使用OpenGL和GLSL的基本阴影映射工件

来自分类Dev

WebGL和OpenGL的性能

来自分类Dev

对GLSL和OpenGL感到困惑

来自分类Dev

我很好奇使用include是否会导致性能下降

来自分类Dev

OpenGL和GLSL中的凹凸贴图

来自分类Dev

在GLSL和OpenGL中使用2D PNG中的3D查找表

来自分类Dev

OpenGL:为什么这些代码无法使用交错的VBO和GLSL绘制任何内容

来自分类Dev

使用glsl的现代OpenGL中的最佳矩阵结构和CPU / GPU通信

来自分类Dev

使用C ++和OpenGL创建带有简单控件的简单窗口

来自分类Dev

Opengl / GLSL在数组中使用SSBO

来自分类Dev

C#性能好奇心

来自分类Dev

C#性能好奇心

来自分类Dev

OpenGL-GLM和GLSL,它们有何不同?

来自分类Dev

OpenGL细分和GLSL用于细分控制明暗器的说明

来自分类Dev

GLSL / OpenGL着色器曲面细分闪烁和失败

来自分类Dev

使用OpenGL / GLSL的HDR Bloom效果渲染管道

来自分类Dev

如何使用GLSL在现代OpenGL中渲染文本

来自分类Dev

何时在游戏中的OpenGL中使用GLSL着色器?

来自分类Dev

使用LESS和SASS的性能

来自分类Dev

OpenGL GLSL GLUT冲突

来自分类Dev

OpenGL GLSL 日志

来自分类Dev

ios-结合OpenGL和UIKit CoreGraphics性能

来自分类Dev

使用SDL2和Glew,尝试在OpenGL中绘制一个简单的白色正方形。只是黑屏

Related 相关文章

热门标签

归档