В настоящее время я пытаюсь использовать геометрический шейдер.
Мой вход представляет собой набор точек, для которых должен быть создан несколько треугольников
Это геометрический шейдер
#version 330
layout(points) in;
layout(triangle_strip, max_vertices = 3) out;
in vec3[] vPos;
out vec3 oPos;
void main() {
for(int i = -1; i <= 1; i++)
for(int j = -1; j <= 1; j++)
{
for(int k = -1; k <= 1; k++)
{
oPos = vPos[0] + vec3(i,j,k);
EmitVertex();
}
EndPrimitive();
}
}
И это соответствующий код C ++
mMeshGenerator->use();
GLuint query;
glGenQueries(1, &query);
glEnable(GL_RASTERIZER_DISCARD);
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, mMeshVBO->buffer());
glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, query);
glBeginTransformFeedback(GL_TRIANGLES);
mPointsVAO->draw();
glEndTransformFeedback();
glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
glFlush();
GLuint primitives;
glGetQueryObjectuiv(query, GL_QUERY_RESULT, &primitives);
std::cout << "-----" << primitives << "-----" << std::endl;
GLfloat feedback[primitives*3*3];
glGetBufferSubData(GL_TRANSFORM_FEEDBACK_BUFFER, 0, sizeof(feedback), feedback);
for (int i = 0; i < primitives*3*3; i++) {
printf("%f\n", feedback[i]);
}
glDisable(GL_RASTERIZER_DISCARD);
Согласно запросу написан только один примитив.
Выход для точки ввода (10,20,30):
-----1-----
9.000000
19.000000
29.000000
9.000000
19.000000
30.000000
9.000000
19.000000
31.000000
Что плохого в моем коде, что есть только 1 треугольник вместо 27?
layout(triangle_strip, max_vertices = 3) out;
это означает, что только 3 вершины (a.k.a. 1 треугольник) будут разрешены для испускания; все остальное отбрасывается