片段着色器跳过部分编码

时间:2018-12-04 09:01:26

标签: python-3.x kivy glsl

嗨,当我制作片段着色器代码时,我使用了:

---fragment
$HEADER$
void main(void)
{
    float width = 0.0;
    float offset = 0.1;
    vec4 out_color = vec4(0, 0, 1, 1);
    float coord = normalize(gl_FragCoord.x);
    if (width == 0.0)   {
        vec4 out_color = vec4(0, 1, 1, 1);
    }
    else if (mod(((coord+offset) / width),2.0) < 0.3)   {
        vec4 out_color = vec4(0, 0, 0, 1);
    }
    gl_FragColor = out_color;
}

但是在使用顶点着色器运行文件时:

---vertex
$HEADER$
void main(void)
{
    vec4 pos = vec4(vPosition.xy, 0.0, 1.0);
    gl_Position = projection_mat * modelview_mat * pos;
}

和python代码:

from kivy.app import App
from kivy.base import EventLoop
from kivy.graphics import Mesh
from kivy.graphics.instructions import RenderContext
from kivy.uix.widget import Widged
w = 1000
h = 600

class GlslDemo(Widget):
    def __init__(self, **kwargs):
        Widget.__init__(self, **kwargs)
        self.canvas = RenderContext(use_parent_projection=True)
        self.canvas.shader.source = 'basic.glsl'

        fmt = ( 
             (b'vPosition', 2, 'float'),
        )

        vertices = (  
             0, 0,
             w, 0,
             w, h,
             0, h,
        )

        indices = (0, 1, 2, 2, 3, 0)  

        with self.canvas:
             Mesh(fmt=fmt, mode='triangles', 
                  indices=indices, vertices=vertices)
 class GlslApp(App):
     def build(self):
         EventLoop.ensure_window()
         return GlslDemo()

 if __name__ == '__main__':
     GlslApp().run()

运行此文件时的问题是它仅输出vec4 out_color并跳过片段着色器代码的if和if else语句。

1 个答案:

答案 0 :(得分:0)

在片段着色器中将变量out_color声明3次

main范围内的第一名

vec4 out_color = vec4(0, 0, 1, 1);

if语句中另外2次:

if (width == 0.0)   {
    vec4 out_color = vec4(0, 1, 1, 1);
}
else if (mod(((coord+offset) / width),2.0) < 0.3)   {
    vec4 out_color = vec4(0, 0, 0, 1);
}

您必须分配给在main范围内声明的变量,而不是在if语句中声明新变量:

vec4 out_color = vec4(0, 0, 1, 1);
if (width == 0.0)   {
    out_color = vec4(0, 1, 1, 1);
}
else if (mod(((coord+offset) / width),2.0) < 0.3)   {
    out_color = vec4(0, 0, 0, 1);
}

请注意,vec4 out_color;是变量声明,因此vec4 out_color = vec4(0, 1, 1, 1);是对新变量的分配,而out_color = vec4(0, 1, 1, 1);则是对现有变量out_color的分配。