无法将属性加载到着色器中
Unable to load Attribute into 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();
}
});
但是没有效果..
我在这里做错了什么?
执行此操作的正确方法是什么?
我从未尝试过通过 ShaderProgram 设置顶点属性。我什至不确定为什么它作为一个选项存在,因为顶点数据应该是每个顶点的。由于您是为整个网格设置它,因此它应该是统一的。而且由于它是制服,您也不必通过 varying 传递它。
所以从你的顶点着色器中移除 varying 和 attribute。并将片段着色器中的 varying 更改为 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();
}
但是您还应该在首次设置时调用此代码来设置此制服的默认值。在您设置它们的值之前,行为可能未定义。
我想将一些自定义数据存储在着色器中,以便在渲染期间重新用于多个帧。 起初我尝试做的是存储一个颜色缓冲区,看看是否可以做到。
顶点着色器:
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();
}
});
但是没有效果..
我在这里做错了什么?
执行此操作的正确方法是什么?
我从未尝试过通过 ShaderProgram 设置顶点属性。我什至不确定为什么它作为一个选项存在,因为顶点数据应该是每个顶点的。由于您是为整个网格设置它,因此它应该是统一的。而且由于它是制服,您也不必通过 varying 传递它。
所以从你的顶点着色器中移除 varying 和 attribute。并将片段着色器中的 varying 更改为 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();
}
但是您还应该在首次设置时调用此代码来设置此制服的默认值。在您设置它们的值之前,行为可能未定义。