2011-10-11 106 views
0

如何通过glUniform **移动世界中的对象?通过glUniform OpenGL ES 2.0在着色器中移动对象

我试图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]; 
} 

编辑:

_positionLocation=glGetAttribLocation(programHandle, "Translation"); 
glUniform3f(_positionLocation, -1.0f, 6.0f, -2.0f); 
    glDrawElements(GL_TRIANGLE_STRIP, 14, GL_UNSIGNED_SHORT, indices); 

    glUniform3f(_positionLocation, 1.0f, 6.0f, -2.0f); 
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer2); 

如果我只画立方体或仅平方米一切正常。但看起来,它的两个呈现在相同的位置,我只看到立方体。似乎这种方法不起作用。 glDrawArrays(GL_TRIANGLE_STRIP,0,4);

+0

什么是相应的着色器? –

+0

我看到正确,你想通过unfiorm API更改属性值吗?虽然更多的代码会更好地帮助理解你在做什么。 –

+0

是的,我需要改变第二个对象(方形)的位置。 – SevenDays

回答

3
gl_Position = Projection * Modelview *Position; 

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

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); 

BTW:那些不叫“槽”,他们是所谓的“位置”。

+0

中进行了介绍请参阅编辑。 ...... – SevenDays

+2

为什么不直接使用模型视图矩阵?在我看来,这是最明显的答案。 – Luca

+1

@wsevendays你不能使用glGetAttribLocation进行制服,你必须使用glGetUniformLocation。 –