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. В чём может быть дело?
Re: OpenGL: некорректная передача целочисленных данных в вершинный шейдер
От: ylem  
Дата: 24.12.18 11:35
Оценка:
Сварщик я не настоящий, но вот это точно нормально? 3 vs. 4

__>struct Vertex {

__> GLfloat position[3];
...
__>};

__>layout(location = 0) in vec4 vPosition;
Re[2]: OpenGL: некорректная передача целочисленных данных в вершинный шейдер
От: _vanger_  
Дата: 24.12.18 12:26
Оценка:
Здравствуйте, ylem, Вы писали:

Y>Сварщик я не настоящий, но вот это точно нормально? 3 vs. 4


Да. Четвёртая компонента, в таком случае, выставляется в 1.
https://stackoverflow.com/questions/18935203/shader-position-vec4-or-vec3
Re[3]: OpenGL: некорректная передача целочисленных данных в вершинный шейдер
От: ylem  
Дата: 25.12.18 08:34
Оценка:
__>Да. Четвёртая компонента, в таком случае, выставляется в 1.
__>https://stackoverflow.com/questions/18935203/shader-position-vec4-or-vec3

Спасибо! Если найдете живую тусовку про OpenGL, и где не гонят с нубскими вопросами, поделитесь, пожалуйста
Re[4]: OpenGL: некорректная передача целочисленных данных в вершинный шейдер
От: _vanger_  
Дата: 29.12.18 04:43
Оценка:
Здравствуйте, ylem, Вы писали:

Y> Если найдете живую тусовку про OpenGL, и где не гонят с нубскими вопросами, поделитесь, пожалуйста


Взаимно

С исходным вопросом, кстати, разобрался. Я -- лопух, и, на самом деле, рабочий код имел чуть отличную структуру от описанного в стартпосте. Я пробрасывал ivec3 vTest в пиксельный шейдер, чтобы красить вершины, в зависимости от значения там. А для каждого пикселя данные из вершин треугольника, которому он принадлежит, интерполируются (если явно не указан параметр интерполяции flat: https://www.khronos.org/opengl/wiki/Type_Qualifier_(GLSL)#Interpolation_qualifiers). Ну и понятно, что целочисленные данные интерполируются плохо Извиняюсь за неточную информацию в вопросе.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.