Есть вершины такого типа
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. В чём может быть дело?
Сварщик я не настоящий, но вот это точно нормально? 3 vs. 4
__>struct Vertex {
__> GLfloat position[3];
...
__>};
__>layout(location = 0) in vec4 vPosition;
Здравствуйте, ylem, Вы писали:
Y>Сварщик я не настоящий, но вот это точно нормально? 3 vs. 4
Да. Четвёртая компонента, в таком случае, выставляется в 1.
https://stackoverflow.com/questions/18935203/shader-position-vec4-or-vec3
__>Да. Четвёртая компонента, в таком случае, выставляется в 1.
__>https://stackoverflow.com/questions/18935203/shader-position-vec4-or-vec3
Спасибо! Если найдете живую тусовку про OpenGL, и где не гонят с нубскими вопросами, поделитесь, пожалуйста
Здравствуйте, ylem, Вы писали:
Y> Если найдете живую тусовку про OpenGL, и где не гонят с нубскими вопросами, поделитесь, пожалуйста
Взаимно
С исходным вопросом, кстати, разобрался. Я -- лопух, и, на самом деле, рабочий код имел чуть отличную структуру от описанного в стартпосте. Я пробрасывал ivec3 vTest в пиксельный шейдер, чтобы красить вершины, в зависимости от значения там. А для каждого пикселя данные из вершин треугольника, которому он принадлежит, интерполируются (если явно не указан параметр интерполяции flat:
https://www.khronos.org/opengl/wiki/Type_Qualifier_(GLSL)#Interpolation_qualifiers). Ну и понятно, что целочисленные данные интерполируются плохо
Извиняюсь за неточную информацию в вопросе.