我在使用OpenGLES着色器管道时遇到问题。我有一件带有3件制服的着色器
attribute vec4 position;
uniform mat4 modelViewProjection;
uniform vec3 objectColor;
uniform vec2 positionObject;
void main()
{
vec4 pos = vec4(-positionObject.x + objectColor.x, 0, -positionObject.y, 0);
gl_Position = modelViewProjection * (position + pos);
}
modelViewProjection和positionObject工作正常,但是当试图让片段着色器工作时我注意到objectColor没有做任何事情所以我尝试在顶点着色器中进行实验,然后最终发现它始终保持初始值无论什么命令它被定义,它是什么类型,它的名字等。
我正在遵循着色器管道的标准过程:
编译 - >链接 - >使用程序 - >获取位置 - >初始化 均匀的
并且objectColor制服甚至得到一个活跃制服的ID,并计入活动制服,但每当我尝试更改它的值时,它总是保持为零。
以下是代码的片段:
统一位置:
private void BindUniforms()
{
glUniforms[(int)UNIFORMS_T.MODEL_VIEW_PROJECTION] = GL.GetUniformLocation(glProgramId, "modelViewProjection");
glUniforms[(int)UNIFORMS_T.OBJECT_POSITION] = GL.GetUniformLocation(glProgramId, "positionObject");
glUniforms[(int)UNIFORMS_T.OBJECT_COLOR] = GL.GetUniformLocation(glProgramId, "objectColor");
}
渲染第1部分:
protected override void OnRenderFrame(FrameEventArgs e)
{
base.OnRenderFrame(e);
GL.ClearColor(0f, 0f, 0f, 1f);
GL.Clear((uint)All.ColorBufferBit);
GL.UseProgram(shader.glProgram);
GL.UniformMatrix4(shader.GetUniform(Shader.UNIFORMS_T.MODEL_VIEW_PROJECTION), 1, false, ref modelViewProjection.Row0.X);
GL.Uniform3(shader.GetUniform(Shader.UNIFORMS_T.OBJECT_COLOR), 1, 1, 1);
lattice.Draw();
SwapBuffers();
}
渲染第2部分:
public void Draw()
{
//Update Uniform
GL.Uniform2(shader.GetUniform(Shader.UNIFORMS_T.OBJECT_POSITION), 1, ref m_vec2Position.X);
GL.Uniform3(shader.GetUniform(Shader.UNIFORMS_T.OBJECT_COLOR), 1, 1, 1);
var colVal = new Vector3(-1, -1, -1); //becomes 0, 0, 0
var posVal = new Vector2(-1, -1); //becomes arbitrary value
GL.GetUniform(shader.glProgram, shader.GetUniform(Shader.UNIFORMS_T.OBJECT_COLOR), ref colVal.X);
GL.GetUniform(shader.glProgram, shader.GetUniform(Shader.UNIFORMS_T.OBJECT_POSITION), ref posVal.X);
// Update attribute values.
GL.BindBuffer(All.ArrayBuffer, glVBO);
GL.VertexAttribPointer((int)Shader.ATTRIBUTES_T.VERTEX_POSITION, 3, All.Float, false, sizeof(float) * 3, IntPtr.Zero);
GL.EnableVertexAttribArray((int)Shader.ATTRIBUTES_T.VERTEX_POSITION);
GL.BindBuffer(All.ElementArrayBuffer, glVBI);
GL.DrawElements(All.LineStrip, Indices.Length, All.UnsignedShort, IntPtr.Zero);
GL.BindBuffer(All.ArrayBuffer, 0);
GL.BindBuffer(All.ElementArrayBuffer, 0);
}
我很可能错过了一些微不足道的东西,但我似乎无法找到它......在Android上使用Xamarin。
答案 0 :(得分:0)
没关系,似乎GL.Uniform *重载直接取个别值而不是引用至少在OpenGLES20中不起作用。