Есть вершины такого типа
struct Vertex {
GLfloat position[3];
GLint test[3];
};
Вершинный шейдер такого типа
layout(location = 0) in vec4 vPosition;
layout(location = 1) in ivec3 vTest;
void main()
{
gl_Position = vPosition;
if (vTest[0] + vTest[1] + vTest[2] > 0)
// Никогда не выполняется
gl_Position = vPosition + vec4(1.0, 0.0, 0.0, 0.0);
}
Инициализирую данные следующим образом
glGenVertexArrays(1, &m_VAO);
glGenBuffers(1, &m_VBO);
glGenBuffers(1, &m_EBO);
glBindVertexArray(m_VAO);
glBindBuffer(GL_ARRAY_BUFFER, m_VBO);
glBufferData(GL_ARRAY_BUFFER, m_vertices.size() * sizeof(Vertex), &m_vertices[0], GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_indices.size() * sizeof(GLuint), &m_indices[0], GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)0);
glEnableVertexAttribArray(0);
glVertexAttribIPointer(1, 3, GL_INT, sizeof(Vertex), (void*)offsetof(Vertex, test));
glEnableVertexAttribArray(1);
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
В вершинный шейдер, что бы я не писал в Vertex.test, передаются только нули. Если все int заменить на float и, соответственно, glVertexAttribIPointer на glVertexAttribPointer, то всё передаётся как надо. Гугление наводило только на обратные случаи: где люди забывали вместо glVertexAttribPointer использовать glVertexAttribIPointer. В чём может быть дело?