OpenGL: некорректная передача целочисленных данных в вершинный шейдер
От: _vanger_  
Дата: 24.12.18 00:14
Оценка: 2 (1)
Есть вершины такого типа
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. В чём может быть дело?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.