Прикручиваю инстансинг к небольшой анимации на OpenGL, хочу добавить простейшую анимацию капель дождя, однако решил потренироваться на отрисовке квадратов по одному из гайдов.
Код вершинного шейдера:
#version 460 core
layout (location = 0) in vec3 aPos;
uniform vec2 offsets[100];
void main()
{
vec3 offset = offsets[gl_InstanceID];
gl_Position = vec4(aPos + offset, 0.0, 1.0);
}
Код фрагментного шейдера:
#version 460 core
out vec4 color;
void main()
{
color = vec4(1.0f, 1.0f, 0.0f, 1.0f);
}
Перед основным циклом заполняю массив offset из вершинного шейдера.
glm::vec2 translations[100];
int index = 0;
float offset = 0.1f;
for (int y = -10; y < 10; y += 2)
{
for (int x = -10; x < 10; x += 2)
{
glm::vec2 translation;
translation.x = (float)x / 10.0f + offset;
translation.y = (float)y / 10.0f + offset;
translations[index++] = translation;
}
}
glUseProgram(shaderProgramForRaindrops);
for (unsigned int i = 0; i < 100; i++)
{
stringstream ss;
string index;
ss << i;
index = ss.str();
GLint offsetArray = glGetUniformLocation(shaderProgramForRaindrops, ("offsets[" + index + "]").c_str());
glUniform2fv(offsetArray, 0, glm::value_ptr(translations[i]));
}
Координаты самого квадрата:
GLfloat raindrops[] = {
-0.05f, 0.05f, 0.0f,
0.05f, -0.05f, 0.0f,
-0.05f, -0.05f, 0.0f,
-0.05f, 0.05f, 0.0f,
0.05f, -0.05f, 0.0f,
0.05f, 0.05f, 0.0f
};
Привязываю к VAO:
glBindVertexArray(VAOs[2]);
glBindBuffer(GL_ARRAY_BUFFER, VBOs[2]);
glBufferData(GL_ARRAY_BUFFER, sizeof(raindrops), raindrops, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0);
glBindVertexArray(0);
Ну и в основном цикле через DrawArrayInstances пытаюсь отрисовать эти самые квадраты.
/* Третья программа */
glUseProgram(shaderProgramForRaindrops);
glBindVertexArray(VAOs[2]);
glDrawArraysInstanced(GL_TRIANGLES, 0, 6, 100);
glBindVertexArray(0);
В результате я получаю один квадрат по центру (что, в общем-то, логично, базовые координаты), и никаких квадратов по смещению, в чём может быть проблема?