Так что недавно я программировал fps-игру на своем ноутбуке, но когда я пытался запустить игру на своем стационарном компьютере, который должен работать лучше, он работает медленнее?C++ Opengl Glsl Shader Performance Issue
Вот несколько скриншотов, сравнивающих простую тестовую сцену с и без skybox. (Стационарный компьютер - Top, Laptop - Bottom)
Как вы можете видеть до сих пор это то, что я бы excpect, но когда я добавить тот же скайбокс рендеринга код + код шейдера (Стационарный компьютер - Top, Laptop - Bottom)
Как вы можете видеть сейчас, результаты являются полной противоположностью, и я не знаю, зачем это понимать, если я смотрю вверх или назад с помощью skybox на моем стационарном компьютере. Я получаю 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+ кадров в секунду слева, но если добавить тех, на мой стационарный, то я получаю около 15.
Если мой стационарный будет выполнять хуже в начале Меня бы не волновало, почему, но так как я не хочу знать, где потерян fps!
стационарные компьютерные функции:
Процессор: Intel Core i5 @ 2.80GHz
RAM: 4,00GB Двухканальная
Графика: ATI Radeon HD 4800 Series
ноутбук спецификации:
Процессор: Intel Core i7 @ 2.00GHz
RAM: 8,00GB Двухканальная
Графика: Intel HD Graphics 4000
Rendering (Обновлено) Для рендеринга я использую G-буфер, установки, как это (из учебника в deffered освещения):
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;
Так что мой вопрос: Что может быть причиной этого? И есть ли решение?
Я подозреваю, что это проблема с заполнением, за которой это довольно сложно сказать. Вы перестали очищать буфер цвета/глубины, когда вы добавили skybox? Много старых ресурсов скажут вам, что это оптимизация, которую вы можете использовать с skyboxes, но на современных графических процессорах (которые используют сжатие буфера) это ничего, кроме. Кроме того, в каком порядке вы создаете skybox? Чтобы сделать его наименее заполняющим, вы должны нарисовать его после всей непрозрачной геометрии. Если вы уже рисуете этот путь, вы можете попробовать сначала рисовать skybox, чтобы переоценить любые ограничения на заливку, чтобы отслеживать узкое место. –
@ AndonM.Coleman Я визуализирую все в буфер второго кадра, который содержит положение/diffuse/normal/texcoord texture2Ds и текстуру глубины + трафарета, а затем после моих вычислений освещения я бликую окончательное изображение к исходному фреймбуферу. Поэтому я очищаю последние буферы изображений один раз перед «прохождением геометрии». Но я использую только диффузную текстуру для skybox, но для местности я использую другие. Я рендеринга skybox last на самом деле, я попробовал сначала перенести его, но это дало еще больший fps. –
О, ничего себе. С этим связано много чего, если вы заинтересованы в оптимизации производительности. Вы можете закрепить позицию G-Buffer и перестроить позицию с глубины, и вы не хотите, чтобы blub framebuffers, если вы не пытаетесь разрешить MSAA. Рисование текстурированного квадратика будет значительно быстрее, чем 'glBlitFramebuffer (...)' в большинстве случаев. –