无法将属性加载到着色器中

问题描述 投票:1回答:1

我想让一些自定义的数据存储在shader里面,以便在渲染过程中可以重复使用多帧。一开始我想做的是存储一个颜色缓冲区,看看能不能做到。

顶点着色器。

attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;

uniform mat4 u_projTrans;

varying vec4 v_color;
varying vec2 v_texCoords;
vec2 u_mouse;
uniform float u_time;
attribute vec3 my_data;
varying vec3 frag_data;

void main() {
    v_color = a_color;
    v_texCoords = a_texCoord0;
    gl_Position = u_projTrans * a_position;
    frag_data = my_data;
}

片段着色器:

#ifdef GL_ES
precision mediump float;
#endif

uniform vec2 u_resolution;
uniform vec2 u_mouse;
uniform float u_time;

varying vec3 frag_data;

void main(){
    gl_FragColor = vec4(vec3(frag_data),1.0);
}

着色器编译后可以正常工作,除了使用了以下的方法 vec3 my_data:

        ShaderProgram.pedantic = false;
        vertex_shader = Gdx.files.internal("vertex_shader.glsl").readString();
        fragment_shader = Gdx.files.internal("fragment_shader.glsl").readString();
        shader_program = new ShaderProgram(vertex_shader, fragment_shader);

我试图通过点击按钮来设置变量,就像这样。

        goBtn = new TextButton("Reset", textButtonStyle);
        goBtn.setSize(128,128);
        goBtn.addListener(new ChangeListener() {
            @Override
            public void changed(ChangeEvent event, Actor actor) {
                FloatBuffer myArray = BufferUtils.newFloatBuffer(3);
                myArray.put(1.0f);myArray.put(1.0f);myArray.put(1.0f);

                shader_program.begin();
                shader_program.setVertexAttribute("my_data", 3, GL20.GL_FLOAT, false, 0, myArray);
                shader_program.end();
            }
        });

但是没有效果...

我到底做错了什么?

正确的做法是什么?

java opengl libgdx glsl
1个回答
1
投票

我从未尝试过通过ShaderProgram设置顶点属性。我甚至不知道为什么会有这个选项,因为顶点数据应该是每个顶点的。既然你是为整个网格设置的,那么它应该是一个统一的。既然是统一的,你也不必通过variing来传递。

所以从你的顶点着色器中删除variing和属性。并将片段着色器中的variing改为uniform。

然后传递数据。

        public void changed(ChangeEvent event, Actor actor) {
            shader_program.begin();
            shader_program.setUniformf("my_data", 1.0f, 1.0f, 1.0f);
            shader_program.end();
        }

但你也应该调用这段代码来设置这个统一体的默认值 当你第一次设置时。在你设置它们的值之前,行为可能是未定义的。

© www.soinside.com 2019 - 2024. All rights reserved.