Если вы используете атрибут, вы должны определить массив общих атрибутов вершины, с одним значением атрибута на координату вершины (3 в вашем случае).См. Спецификация вершины .
Если вы используете униформу, вы можете установить одно значение для программы, хранящейся в универсальной переменной в унифицированном блоке по умолчанию (вы можете представить это как глобальную переменную),См. Uniform (GLSL) :
Case 1 - Атрибут myAttrib
:
Вершинный шейдер
#version 130
attribute vec2 vPosition;
attribute float myAttrib;
void main()
{
gl_Position = vec4(vPosition.x, vPosition.y + myAttrib, 0.0, 1.0);
}
Вы должны определить массив общих атрибутов вершин, как вы это делаете для координат вершин:
attrib = [-0.2, 0.2, 0.0]
myAttrib = numpy.array(attrib, dtype = numpy.float32)
# .....
glLinkProgram(shaderProgram)
myAttrib_location = glGetAttribLocation(shaderProgram, "myAttrib")
# .....
glVertexAttribPointer(myAttrib_location, 1, GL_FLOAT, GL_FALSE, 0, myAttrib)
glEnableVertexAttribArray(myAttrib_location)
или
glBindAttribLocation(shaderProgram, 1, "myAttrib")
glLinkProgram(shaderProgram)
# .....
glVertexAttribPointer(1, 1, GL_FLOAT, GL_FALSE, 0, myAttrib)
glEnableVertexAttribArray(1)
Случай 2 - УнифицированныйmyUniform
Вершинный шейдер
#version 130
attribute vec2 vPosition;
uniform float myUniform;
void main()
{
gl_Position = vec4(vPosition.x, vPosition.y + myUniform, 0.0, 1.0);
}
Получить местоположение униформы ("myUniform"
) с помощью glGetUniformLocation
и установите значение в форму: glUniform
:
myUniform = 0.3
# .....
glLinkProgram(shaderProgram)
myUniform_location = glGetUniformLocation(shaderProgram, "myUniform")
# .....
glUseProgram(shaderProgram)
glUniform1f(myUniform_location, myUniform)
glDrawArrays(GL_TRIANGLES, 0, 3)