Код: Выделить всё
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import RenderContext, Color, Rectangle
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import NumericProperty
class ShaderWidget(Widget):
mid_point = NumericProperty(0.0)
def __init__(self, **kwargs):
self.canvas = RenderContext()
super(ShaderWidget, self).__init__(**kwargs)
self.canvas.shader.fs = '''
$HEADER$
uniform vec2 resolution;
uniform float u_mid_point;
void main(void) {
vec2 pos = gl_FragCoord.xy / resolution.xy;
float alpha_channel_rate;
if (gl_FragCoord.x < u_mid_point) {
alpha_channel_rate = pow(gl_FragCoord.x / u_mid_point, 2.0);
} else {
alpha_channel_rate = pow((resolution.x - gl_FragCoord.x) / u_mid_point, 2.0);
}
vec4 color = vec4(alpha_channel_rate * 0.5, alpha_channel_rate * 0.5, alpha_channel_rate * 0.5, 1.0);
gl_FragColor = color;
}
'''
with self.canvas:
Color(1, 1, 1, 1) # White color
self.rect = Rectangle(pos=self.pos, size=self.size)
self.bind(size=self.update_rect, pos=self.update_rect)
def update_rect(self, *args):
self.rect.pos = self.pos
self.rect.size = self.size
self.canvas['resolution'] = [self.width, self.height]
self.canvas['u_mid_point'] = self.width / 2
class GradientApp(App):
def build(self):
layout = BoxLayout()
shader_widget = ShaderWidget()
layout.add_widget(shader_widget)
return layout
if __name__ == '__main__':
GradientApp().run()
Подробнее здесь: https://stackoverflow.com/questions/790 ... -of-screen