为什么EndPrimitive函数有时不起作用?

时间:2016-03-22 14:27:21

标签: opengl glsl qtgui geometry-shader mesa

问题

有时,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 screenshot所示。

在渲染数据时拍摄了截图:

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

和: star from 4 points

来自数据:

    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个三角形) - 结果相同。

观察

  • 有时它工作得很好
  • 它是稳定的(在帧之间不会改变)
  • 通常,只有少数基元(不是所有来自一个输入点)之间存在不需要的连接
  • 第一个输入点没有发现不需要的连接(通常,它们出现在第二个输入点)

我的想法

  1. 也许output limitations存在问题?
  2. 司机问题?
  3. 可能是我的误用
  4. 环境

    • Qt 5.5
    • 的OpenGL
      • OpenGL供应商字符串:英特尔开源技术中心
      • OpenGL渲染器字符串:Mesa DRI Intel(R)Haswell Desktop
      • OpenGL核心配置文件版本字符串:3.3(核心配置文件)Mesa 10.6.5

0 个答案:

没有答案