фрагментный шейдер пропускает часть кодирования - PullRequest
0 голосов
/ 04 декабря 2018

Привет, когда я сделал кодирование моего фрагментного шейдера, я использую:

---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 голосов
/ 04 декабря 2018

Переменная out_color объявляется 3 раза в фрагментном шейдере

1-й в области действия main

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

И еще 2 раза в операторе if:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...