Импорт шейдера Shadertoy в libgdx

Я искал везде, но не нашел ссылки. Я хочу использовать этот шейдер от shadertoy в своем проекте libgdx, поэтому я попытался импортировать простой шейдер сначала из: https://www.shadertoy.com/view/XsffRs

Я немного изменил его, но безуспешно:

/*
 * Original shader from: https://www.shadertoy.com/view/XsffRs
 */

#ifdef GL_ES
precision mediump float;
#endif

uniform float time;
uniform vec2 resolution;

// shadertoy emulation
#define iTime time
#define iResolution resolution

// --------[ Original ShaderToy begins here ]---------- //
#define TAU 6.28318531
float C,S;

mat2 rot(float a){
    return mat2(C=cos(a),S=sin(a),-S,C);
}

float map(vec3 p) {
    p.yz*=rot(p.z*(.03*sin(iTime*3.)));
    p.xz*=rot(p.z*(.03*cos(iTime*3.)));
    float m=TAU/6.,
    l=length(p.xy),
    a=mod(atan(p.y,p.x)-p.z*.5+iTime*5.,m)-.5*m;
    return length(vec2(a*l,l-2.))-.8;
}


void main(void)
{
    vec2 uv = gl_FragCoord.xy / iResolution.xy;
    uv-=.5;
    uv.x*=iResolution.x/iResolution.y;
    vec3 ro=vec3(uv,-3.),rd=normalize(vec3(uv,1.)),mp=ro;
    float i=0.;
    for (int ii=0;ii<30;++ii) {
        i++;
        float md=map(mp);
        if (abs(md)<.001)break;
        mp+=rd*md;
    }
    float r=i/30.;
    float d=length(mp-ro)*.1;
    vec3 c=mix(vec3(.2,.5,.7)*d*d,vec3(.2,.4,.8)*r/d,r*r);
    c=sqrt(c);
    gl_FragColor = vec4(c,1.);

}

Код для ShaderProgram

    public void create () {

        width = Gdx.graphics.getWidth();
        height = Gdx.graphics.getHeight();

        batch = new SpriteBatch();
        ShaderProgram.pedantic = false;
        shader = new ShaderProgram(Gdx.files.internal("vert.vert"), Gdx.files.internal("frag.frag"));
        if(!shader.isCompiled())
            shader.getLog();
    }

    public void render () {
        time+=Gdx.graphics.getDeltaTime();

        shader.begin();
        shader.setUniformf("resolution", new Vector2(width, height));
        shader.setUniformf("time", time);
        shader.end();
        
        batch.begin();
        batch.setShader(shader);
        batch.end();
    }

Шейдер работает без ошибок, но с черным экраном.

Редактировать: это работает, рисуя фиктивную текстуру
Texture t = new Texture(new Pixmap(width,height, Pixmap.Format.RGB565)); с помощью spritebatch, но не знаю, зачем требуется фиктивная текстура?


person Shubham Agrawal    schedule 22.07.2020    source источник
comment
При создании экземпляра ShaderProgram отметьте shaderProgram.isCompiled(). Если он не скомпилирован, зарегистрируйте ShaderProgram.getLog(), чтобы увидеть, где находятся ошибки в вашем шейдере. Если шейдер не скомпилируется, LibGDX не будет жаловаться, когда вы попытаетесь его использовать. Он просто станет черным.   -  person Tenfour04    schedule 22.07.2020
comment
Вы не забыли установить форму на стороне Java?   -  person Tenfour04    schedule 22.07.2020
comment
@ Tenfour04 Не получает журнал   -  person Shubham Agrawal    schedule 22.07.2020


Ответы (1)


Чтобы увидеть шейдер в действии, вам нужно что-то нарисовать, в коде указано только, что шейдер будет использоваться, но с ним ничего не рисуется.

batch.begin();
batch.setShader(shader);
batch.draw(new Texture(new Pixmap(width,height, Pixmap.Format.RGB565),0,0);
batch.end();
person Caolem    schedule 25.07.2020
comment
На самом деле, мой вопрос: можем ли мы рисовать текстуру с помощью шейдера вместо того, чтобы передавать его? Я знаю, что это отдельный вопрос? Но зачем передавать текстуру в шейдер, если я этим не пользуюсь.. - person Shubham Agrawal; 26.07.2020
comment
Представьте, что шейдер — это краска, а текстура — это холст, вы не можете рисовать в воздухе, а на холсте, неважно, есть ли на холсте изображение или он пустой - person Caolem; 09.09.2020