gpt4 book ai didi

C++ Opengl Gsl 着色器性能问题

转载 作者:行者123 更新时间:2023-11-30 02:49:35 25 4
gpt4 key购买 nike

所以最近我一直在我的笔记本电脑上编写一个 fps 游戏,但是当我试图在我的固定电脑上运行游戏时,它应该表现更好,但运行速度变慢了?

这里有几个屏幕截图,比较了使用和不使用天空盒的简单测试场景。 (固定电脑 - 顶部,笔记本电脑 - 底部)

Without Skybox Stationary Computer

Without Skybox Laptop

到目前为止,这是我所期望的,但是当我添加相同的天空盒渲染代码 + 着色器代码时(固定计算机 - 顶部,笔记本电脑 - 底部)

With Skybox Stationary Computer

With Skybox Laptop

正如您现在看到的,结果完全相反,我不知道为什么如果我在固定计算机上使用天空盒向上或向后看,我得到的 fps 约为 5。

这是天空盒的着色器代码:

#version 120
varying vec3 pl;
uniform mat4 gWM;
void main()
{
pl = vec3(gl_Vertex);
gl_Position = (gWM * gl_Vertex).xyww; // I have also tried with gl_ModelViewProjectionMatrix instead of gWM.
}

片段着色器:

#version 120
varying vec3 pl;
uniform samplerCube cubeMap;
void main()
{
gl_FragData[1] = textureCube(cubeMap, -pl);
}

渲染的实际网格是一个球体。

另一件事是,我的笔记本电脑还可以在剩余 100+ fps 的情况下处理我的光照计算,但如果我将这些添加到我的文具中,我将得到大约 15。

如果我的文具在开始时表现更差,我不会关心为什么,但既然它不存在,我真的很想知道 fps 丢失的地方!

固定式计算机规范:

CPU:英特尔酷睿 i5 @ 2.80GHz

内存:4,00GB 双 channel

图形:ATI Radeon HD 4800 系列

笔记本电脑规范:

CPU:英特尔酷睿 i7 @2.00GHz

内存:8,00GB 双 channel

图形:Intel HD Graphics 4000

渲染(更新)对于渲染,我使用了一个像这样设置的 G-Buffer(来自延迟光照教程):

        glGenFramebuffers(1, &m_fbo);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbo);

glGenTextures(ARRAY_ELEMENTS(m_textures), m_textures);
glGenRenderbuffers(1, &m_depthBuffer);
glGenTextures(1, &m_finalTexture);

for(unsigned int i = 0; i < ARRAY_ELEMENTS(m_textures); i++){
glBindTexture(GL_TEXTURE_2D, m_textures[i]);
glTexImage2D(GL_TEXTURE_2D, 0, i == 0 ? GL_RGBA32F : GL_RGB8, WindowWidth, WindowHeight, 0, GL_RGB, GL_FLOAT, NULL);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, m_textures[i], 0);
}

glBindRenderbuffer(GL_RENDERBUFFER, m_depthBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_EXT, WindowWidth, WindowHeight);
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_depthBuffer);

glBindTexture(GL_TEXTURE_2D, m_finalTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, WindowWidth, WindowHeight, 0, GL_RGB, GL_FLOAT, NULL);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT4, GL_TEXTURE_2D, m_finalTexture, 0);

GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if(status != GL_FRAMEBUFFER_COMPLETE){
printf("[Error ] Framebuffer status: 0x%x\n", status);
return false;
}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
mWidth = WindowWidth;
mHeight = WindowHeight;
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
return true;

所以我的问题是:可能是什么原因造成的?有解决办法吗?

最佳答案

当我在我的延迟渲染器上工作时,我只是在 Nividia 560ti 上使用深度纹理和模板开发,我没有遇到任何问题。但是在我的 HD 4650 上,我不会显示任何东西,只是一个黑屏,所以我切换到RenderBuffers对于深度和模板,这解决了我的问题。唯一的缺点是它们不能在着色器中采样。我希望这会有所帮助。

关于C++ Opengl Gsl 着色器性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21121546/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com