有时,OpenGL几何着色器中的EndPrimitive函数不能像我预期的那样工作 - 很少有输出基元连接在一起。
我想绘制一个由给定角度的每次乘法和远离给定中心的线组成的形状(给定最小半径和最大半径)。 我正在尝试编写一个几何着色器,它可以获取有关恒星的信息:
Star.hpp
struct Star{
QVector3D center;
QVector3D color;
GLfloat thickness;
GLfloat repAngle__deg;
GLfloat radiusMin;
GLfloat radiusMax;
};
我将数据作为Point传递给VBO。 几何着色器如下所示:
star.geom
#version 330
layout(points) in;
layout(line_strip, max_vertices = 360) out;
in VS_OUT{
vec3 color;
float thickness;
float repAngleDegrees;
float radiusMin;
float radiusMax;
} gs_in[];
out vec3 fColor;
uniform mat4 matrix;
const float PI = 3.1415926;
void main()
{
if(gs_in[0].thickness > 0){
for(float angle = 0; angle < 360; angle += gs_in[0].repAngleDegrees){
float angleRad = PI*angle/180;
float cosVal = cos(angleRad);
float sinVal = sin(angleRad);
float minR = gs_in[0].radiusMin;
float maxR = gs_in[0].radiusMax;
vec4 minOffset = vec4(cosVal * minR, -sinVal * minR, 0.0, 0.0);
gl_Position = matrix * (gl_in[0].gl_Position + minOffset);
fColor = gs_in[0].color;
EmitVertex();
vec4 maxOffset = vec4(cosVal * maxR, -sinVal * maxR, 0.0, 0.0);
gl_Position = matrix * (gl_in[0].gl_Position + maxOffset);
fColor = gs_in[0].color;
EmitVertex();
EndPrimitive();
}
}
}
如果我传递多个“点”(描述我想要绘制的星形的结构),则返回的基元之间会有一些不需要的连接,如所示。
在渲染数据时拍摄了截图:
Star s;
s.center = {0,0,0};
s.color = {0,0.7,0.1};
s.thickness = 1;
s.repAngle__deg = 15;
QVector<Star> vec;
s.repAngle__deg = 15; s.radiusMin = 25; s.radiusMax = 125;
vec.append(s);
s.repAngle__deg = 30; s.radiusMin = 20; s.radiusMax = 125;
vec.append(s);
s.repAngle__deg = 90; s.radiusMin = 15; s.radiusMax = 125;
vec.append(s);
_vboStars.allocate(vec.constData(), vec.count() * sizeof(Star));
其中_vboStars是QOpenGLBuffer。
来自数据:
s.repAngle__deg = 10; s.radiusMin = 5; s.radiusMax = 10; vec.append(s);
s.repAngle__deg = 15; s.radiusMin = 15; s.radiusMax = 20; vec.append(s);
s.repAngle__deg = 30; s.radiusMin = 25; s.radiusMax = 30; vec.append(s);
s.repAngle__deg = 60; s.radiusMin = 35; s.radiusMax = 40; vec.append(s);
s.repAngle__deg = 90; s.radiusMin = 45; s.radiusMax = 50; vec.append(s);
我认为geometryShader存在问题,但我找不到问题。 我也尝试过返回三角形条带(线条为2个三角形) - 结果相同。