Ваша программа имеет две основные проблемы.#define
не ваша проблема.Первая проблема заключается в том, что вы никогда не предоставляете реализацию функций vec4 ProjectVertexPosition(in vec# v)
.Вам необходимо предоставить объявление, например,
vec4 ProjectVertexPosition(in vec3 v) {
return normalize(vec4(v, 1.0));
}
, а также для версии in vec4 v
.Причина, по которой удаление define решает вашу проблему, заключается в том, что шейдер игнорирует входной блок, который с самого начала недопустим.В вершинном шейдере вы не можете использовать in
блоков.Вместо этого используйте макеты и структуры или униформу и структуры.Для вершинных шейдеров вам нужно использовать только униформу или макеты, а не чистые in
s.Если вы хотите использовать макеты, выполните следующие действия:
layout(location = 0) in VertexPositionType ds_VertexPosition;
Для стороны C / C ++ выполните следующие действия (где pointCount - это количество точек в вашей VAO, а points - это GLfloat *, содержащий точкипо порядку x1, y1, z1, x2, y2, z2, x3 ...:
GLfloat* points = (GLfloat*) malloc(pointCount * 3 * sizeof(GLfloat));
// Set your points however you want here
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, 3 * pointCount * sizeof(GLfloat), points, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(0);
free(points);
// Now to draw (use whatever programId is returned when you link the program)
glUseProgram(programId);
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES, 0, pointCount);
glUseProgram(0);