Opengl es 通过glUniform OpenGL ES 2.0在着色器中移动对象

Opengl es 通过glUniform OpenGL ES 2.0在着色器中移动对象,opengl-es,shader,opengl-es-2.0,vertex-shader,Opengl Es,Shader,Opengl Es 2.0,Vertex Shader,如何通过glUniform**移动世界中的对象 我尝试了glUniform3f(_positionSlot,6.0f,6.0f,-2.0f) 但是我的物体没有移动 shader.vs: attribute vec4 Position; // 1 attribute vec4 SourceColor; // 2 varying vec4 DestinationColor; // 3 uniform mat4 Projection; uniform mat4 Modelview; void mai

如何通过glUniform**移动世界中的对象

我尝试了
glUniform3f(_positionSlot,6.0f,6.0f,-2.0f)

但是我的物体没有移动

shader.vs:

attribute vec4 Position; // 1
attribute vec4 SourceColor; // 2
varying vec4 DestinationColor; // 3
uniform mat4 Projection;
uniform mat4 Modelview;

void main(void) { // 4
   DestinationColor = SourceColor; // 5
   gl_Position = Projection * Modelview *Position;

}
雷德:

- (void)render:(CADisplayLink*)displayLink {
    glClearColor(0, 104.0/255.0, 55.0/255.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
    CC3GLMatrix *projection = [CC3GLMatrix matrix];
    float h = 4.0f * self.frame.size.height / self.frame.size.width;
    [projection populateFromFrustumLeft:-2 andRight:2 andBottom:-h/2 andTop:h/2 andNear:4 andFar:10];
    glUniformMatrix4fv(_projectionUniform, 1, 0, projection.glMatrix);

    CC3GLMatrix *modelView = [CC3GLMatrix matrix];
    [modelView populateFromTranslation:CC3VectorMake(sin(CACurrentMediaTime()), 0, -7)];
    _currentRotation += displayLink.duration * 90;
    [modelView rotateBy:CC3VectorMake(_currentRotation, _currentRotation, 0)];
    glUniformMatrix4fv(_modelViewUniform, 1, 0, modelView.glMatrix);

    // 1
    glViewport(0, 0, self.frame.size.width, self.frame.size.height);

    // 2
    glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glVertexAttribPointer(_colorSlot, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) (sizeof(float) * 3));

    glUniform4f(_colorSlot, 1.0f, 0.0f, 0.0f,1);
    glDrawElements(GL_TRIANGLE_STRIP, 14, GL_UNSIGNED_SHORT, indices);

    glUniform3f(_modelViewUniform, 6.0f, 6.0f, -2.0f);
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer2);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    [_context presentRenderbuffer:GL_RENDERBUFFER];
}
编辑:

如果我只画立方体或正方形,一切都可以。但看起来它在同一个位置呈现,我只看到了立方体。看来这个方法行不通。 gldrawArray(GL_三角带,0,4)

gl_Position
是顶点着色器输出,它接收每个顶点的变换位置,而不仅仅是整个模型。“位置槽”(变化/属性)用于将顶点属性数据,即每个顶点位置传递给着色器。不能将统一应用于属性或变量。你需要一些额外的制服(我们称之为“翻译”):

您可以将其设置为与以下内容一起使用

glUniform3f(positionLocation, 6.0f, 6.0f, -2.0f);
顺便说一句:这些不是“插槽”,它们被称为“位置”

gl_Position
是顶点着色器输出,它接收每个顶点的变换位置,而不仅仅是整个模型。“位置槽”(变化/属性)用于将顶点属性数据,即每个顶点位置传递给着色器。不能将统一应用于属性或变量。你需要一些额外的制服(我们称之为“翻译”):

您可以将其设置为与以下内容一起使用

glUniform3f(positionLocation, 6.0f, 6.0f, -2.0f);

顺便说一句:这些不是所谓的“插槽”,它们被称为“位置”。

相应的着色器是什么?我看得对吗?你想通过Unform API更改属性值吗?虽然更多的代码会更好地帮助理解您正在做的事情。是的,我需要更改第二个对象(正方形)的位置。我认为您最好完全熟悉OpenGL。我建议您在上完成教程-中介绍了您的确切问题,以及相应的着色器是什么?我看得对吗?您是否希望通过未格式化API更改属性值?虽然更多的代码会更好地帮助理解您正在做的事情。是的,我需要更改第二个对象(正方形)的位置。我认为您最好完全熟悉OpenGL。我建议您阅读位于的教程-您的确切问题将在“为什么不直接使用模型视图矩阵”中介绍?在我看来,这是最明显的答案。@wsevendays你不能对制服使用glGetAttribLocation,你必须使用glGetUniformLocation。@Lucapicioni最初认为OP是关于学习实例化所需的技术。为什么不直接使用模型视图矩阵呢?在我看来,这是最明显的答案。@wsevendays你不能在制服上使用glGetAttribLocation,你必须使用glGetUniformLocation。@Lucapicioni最初认为OP是关于学习一种类似实例化所需的技术。
attribute vec4 Position; // 1
attribute vec4 SourceColor; // 2
varying vec4 DestinationColor; // 3
uniform mat4 Projection;
uniform mat4 Modelview;
uniform vec4 Translation;

void main(void) { // 4
   DestinationColor = SourceColor; // 5
   gl_Position = Projection * Modelview * (Position + Translation);
}
glUniform3f(positionLocation, 6.0f, 6.0f, -2.0f);