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

Java 无法将属性加载到着色器中,java,opengl,libgdx,glsl,Java,Opengl,Libgdx,Glsl,我希望在着色器中存储一些自定义数据,以便在渲染期间用于多帧。 首先,我试图做的是存储一个颜色缓冲区,看看这是可以做到的 顶点着色器: 属性向量4 a_位置; 属性向量4 a_颜色; 属性vec2 a_texCoord0; 统一的mat4 u_项目; 可变的vec4 v_颜色; 可变矢量2 v_texCoords; vec2u_小鼠; 均匀浮动u_时间; 属性vec3我的_数据; 可变的vec3 frag_数据; void main(){ v_颜色=a_颜色; v_texCoords=a_texC

我希望在着色器中存储一些自定义数据,以便在渲染期间用于多帧。 首先,我试图做的是存储一个颜色缓冲区,看看这是可以做到的

顶点着色器:

属性向量4 a_位置;
属性向量4 a_颜色;
属性vec2 a_texCoord0;
统一的mat4 u_项目;
可变的vec4 v_颜色;
可变矢量2 v_texCoords;
vec2u_小鼠;
均匀浮动u_时间;
属性vec3我的_数据;
可变的vec3 frag_数据;
void main(){
v_颜色=a_颜色;
v_texCoords=a_texCoord0;
gl_位置=u_项目事务*a_位置;
frag_数据=我的_数据;
}
片段着色器:

\ifdef glu
精密中泵浮子;
#恩迪夫
均匀vec2u_分辨率;
均匀vec2u_小鼠;
均匀浮动u_时间;
可变的vec3 frag_数据;
void main(){
gl_FragColor=vec4(vec3(frag_数据),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_程序=新的ShaderProgram(顶点_着色器、片段_着色器);
我尝试通过单击按钮来设置变量,如下所示:

goBtn=新文本按钮(“重置”,文本按钮样式);
goBtn.setSize(128128);
goBtn.addListener(新的ChangeListener(){
@凌驾
公共无效已更改(ChangeEvent事件、参与者){
FloatBuffer myArray=BufferUtils.newFloatBuffer(3);
myArray.put(1.0f);myArray.put(1.0f);myArray.put(1.0f);
着色器_程序.begin();
shader_program.setVertexAttribute(“我的数据”,3,GL20.GL_FLOAT,false,0,myArray);
着色器_程序.end();
}
});
但是它没有效果

我做错了什么


正确的方法是什么

我从未尝试过通过着色器程序设置顶点属性。我甚至不知道为什么这是一个选项,因为顶点数据应该是逐顶点的。由于要为整个网格设置此选项,因此它应该是均匀的。因为它是一种制服,你也不必通过一种不同的方式传递它

因此,请从顶点着色器中删除“和”属性。并将片段着色器中的“变化”更改为“一致”

以及传递数据:

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

但是,当您第一次设置时,还应该调用此代码来设置此制服的默认值。行为在设置其值之前可能未定义。

您不能将外部的内容附加到变量。您必须将您使用的任何内容绑定到属性,并将该属性传递给variance,就像您已经使用
a_color/v_color
a_texCoord0/v_texCoords
时所做的那样,variance变量是着色器阶段之间的接口变量。必须在顶点着色器中设置
my_data
。如果你想要一个额外的属性,那么你必须使用关键字
属性
你是正确的。我更新了着色器以反映这一点。但是,按下按钮仍然没有效果。在整个渲染步骤中,是否应保持一致值不变?这应该是从着色器内部修改的内容。。这仍然有效吗?如果要为这一个对象切换到其他着色器,则在切换着色器时仍将刷新批处理。但无论如何,您正在更改此侦听器中的值,而不是在呈现期间。这是真的,您编写的内容使程序正常工作。然而,我想这样做的全部原因是为了实际计算GPU上的逐像素操作,现在当我尝试修改它时,出现了以下错误:
错误:0:20:“赋值”:需要l值“我的数据”(无法修改统一)
不完全确定您在做什么。如果它只是一个可用于计算每个片段值的常量,则可以将其复制到
main
函数中的变量中,并修改副本`vec3 localFragData=frag_数据;它应该是计算每像素值,但它不应该是常数,GPU内核会修改它,基本上它会像一个