Форум сайта python.su
Всем доброго времени суток!
С в wx.glcanvas'e отображаю текстуру с помощью шейдеров. Таким образом, при изменении значения uniform'a scale, шейдер компилируется заново, то есть вообще при любом refresh'e происходит компиляция. Подскажите, пожалуйста, возможно ли каким-нибудь образом оптимизировать работу программы.
def OnPaint(self, event):
VERTEX_SHADER = compileShader(“”"
uniform float scale;
void main() {
gl_TexCoord = (gl_Vertex*0.5+0.5)/(1+scale);
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}“”“, GL_VERTEX_SHADER)
FRAGMENT_SHADER = compileShader(”“”
uniform sampler2D color;
void main() {
vec3 tcolor = texture2D(color, gl_TexCoord.st).xyz;
gl_FragColor = vec4(tcolor, 1.0);
}
}“”", GL_FRAGMENT_SHADER)
self.shader = compileProgram(VERTEX_SHADER,FRAGMENT_SHADER)
Офлайн
Простите, еще раз…
Вы утверждаете, что шейдер перекомпилируется при изменении uniform параметров?
Зачем они тогда по вашему нужны — ведь можно было бы обойтисть простыми константами.
Офлайн
Я предположил..Разве не происходит компиляции при каждом смене кадра, если шейдеры находятся в OnPaint?
Офлайн
Ааа. Тогда да. Скомпилируйте шейдеры один раз при первой отрисовке и потом только меняйте uniform parameters перед вызовами.
Офлайн
Но ведь uniform'ы я посылаю в сам шейдер, соответственно, при каждом изменении uniform'a шейдер компилируется заново. Или я что-то не так понимаю?
Офлайн
Шейдер компилируется. На вход получает параметры, меняющиеся от вызова к вызову (координаты вертекса, например) и uniform, задаваемые программистом на весь проход. Они специально были изобретены чтобы ничего не надо было перекомпилировать.
Задаете свои uniform перед отрисовкой, и всё.
Офлайн
Спасибо за информацию, сделал, как надо. Изначально я столкнулся с проблемой утечки памяти, предполагал, что это из-за всего вышесказанного, но, к сожалению, это не помогло. Не подскажете, куда копать?
Офлайн
Офлайн
Всё получилось! Спасибо огромное за помощь! Тема закрыта
Офлайн