2014-01-14 4 views
1

Так что недавно я программировал fps-игру на своем ноутбуке, но когда я пытался запустить игру на своем стационарном компьютере, который должен работать лучше, он работает медленнее?C++ Opengl Glsl Shader Performance Issue

Вот несколько скриншотов, сравнивающих простую тестовую сцену с и без skybox. (Стационарный компьютер - Top, Laptop - Bottom)

Without Skybox Stationary Computer

Without Skybox Laptop

Как вы можете видеть до сих пор это то, что я бы excpect, но когда я добавить тот же скайбокс рендеринга код + код шейдера (Стационарный компьютер - Top, Laptop - Bottom)

With Skybox Stationary Computer

With Skybox Laptop

Как вы можете видеть сейчас, результаты являются полной противоположностью, и я не знаю, зачем это понимать, если я смотрю вверх или назад с помощью 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; 

Так что мой вопрос: Что может быть причиной этого? И есть ли решение?

+0

Я подозреваю, что это проблема с заполнением, за которой это довольно сложно сказать. Вы перестали очищать буфер цвета/глубины, когда вы добавили skybox? Много старых ресурсов скажут вам, что это оптимизация, которую вы можете использовать с skyboxes, но на современных графических процессорах (которые используют сжатие буфера) это ничего, кроме. Кроме того, в каком порядке вы создаете skybox? Чтобы сделать его наименее заполняющим, вы должны нарисовать его после всей непрозрачной геометрии. Если вы уже рисуете этот путь, вы можете попробовать сначала рисовать skybox, чтобы переоценить любые ограничения на заливку, чтобы отслеживать узкое место. –

+0

@ AndonM.Coleman Я визуализирую все в буфер второго кадра, который содержит положение/diffuse/normal/texcoord texture2Ds и текстуру глубины + трафарета, а затем после моих вычислений освещения я бликую окончательное изображение к исходному фреймбуферу. Поэтому я очищаю последние буферы изображений один раз перед «прохождением геометрии». Но я использую только диффузную текстуру для skybox, но для местности я использую другие. Я рендеринга skybox last на самом деле, я попробовал сначала перенести его, но это дало еще больший fps. –

+0

О, ничего себе. С этим связано много чего, если вы заинтересованы в оптимизации производительности. Вы можете закрепить позицию G-Buffer и перестроить позицию с глубины, и вы не хотите, чтобы blub framebuffers, если вы не пытаетесь разрешить MSAA. Рисование текстурированного квадратика будет значительно быстрее, чем 'glBlitFramebuffer (...)' в большинстве случаев. –

ответ

0

Хорошо, поэтому я понял, что проблема была простой. Я забыл разделить на sizeof (float) в коде рендеринга для сферы, чтобы он отображал слишком много, что даже не предполагалось, чтобы получить визуализацию !, но это исправлено, поэтому благодаря всем, чтобы помочь мне получить лучшую производительность!

3

Когда я работал над моим отложенным рендерером, я просто использовал текстуру для глубины и трафарета, развивающуюся на Nividia 560ti, и у меня не было никаких проблем. Но на моем HD 4650 я бы ничего не показывал только на черном экране, поэтому я переключился на RenderBuffers для глубины и трафарета, и это устранило мои проблемы. Единственная его сторона заключается в том, что они не могут быть отобраны в шейдерах. Надеюсь, это поможет.

+0

Учитывая, что весь его движок является отложенным шейдером, кажется, что выборка их на самом деле представляет собой большое дело – BWG

+0

для позиции и нормалей и других атрибутов да, они должны оставаться текстурами, но для глубины и трафарета не нужно, если вы не делаете более продвинутые вещи, т.е. Глубина резкости и SSAO. – user2445735

+0

+1, это на самом деле очень хорошее предложение. – BWG