【问题标题】:EmitVertex gives "error C1067: too little data in type constructor"EmitVertex 给出“错误 C1067:类型构造函数中的数据太少”
【发布时间】:2019-08-28 22:23:40
【问题描述】:

我正在使用几何着色器从 GL_POINTS 生成立方体

#version 150 core

layout(points) in;
layout(triangle_strip, max_vertices = 18) out;

in vec3 g_col[];

out vec3 f_col;

uniform mat4 transform;

void main()
{
    f_col = g_col[0];

    float s = gl_in[0].gl_PointSize * 0.5;

    vec4 c = gl_in[0].gl_Position;

    // Bottom

    gl_Position = transform * (c + vec4 (-s, -s, -s, 0));
    EmitVertex();

    gl_Position = transform * (c + vec4 (+s, -s, -s, 0));
    EmitVertex();

    gl_Position = transform * (c + vec4 (-s, +s, -s, 0));
    EmitVertex();

    gl_Position = transform * (c + vec4 (+s, +s, -s, 0));
    EmitVertex();

    // Far

    gl_Position = transform * (c + vec4 (-s, +s, +s, 0));
    EmitVertex();

    gl_Position = transform * (c + vec4 (+s, +s, +s, 0));
    EmitVertex();

    // Top

    gl_Position = transform * (c + vec4 (-s, -s, +s, 0));
    EmitVertex();

    gl_Position = transform * (c + vec4 (+s, -s, +s, 0));
    EmitVertex();

    // Near

    gl_Position = transform * (c + vec4 (-s, -s, -s, 0));
    EmitVertex();

    gl_Position = transform * (c + vec4 (+s, -s, -s, 0));
    EmitVertex();

    EndPrimitive();

    // Left

    gl_Position = transform * (c + vec4 (-s, -s, -s));
    EmitVertex ();

    gl_Position = transform * (c + vec4 (-s, +s, -s));
    EmitVertex ();

    gl_Position = transform * (c + vec4 (-s, -s, +s));
    EmitVertex ();

    gl_Position = transform * (c + vec4 (-s, +s, +s));
    EmitVertex ();

    EndPrimitive ();
}

如果我在第一个 EndPrimitive 之后(// Left 评论之前)删除代码,这会正确地在立方体周围绘制一条带,使侧面不加盖。

如果我尝试绘制一个新的三角形条来覆盖边,我会在随后的四个 EmitVertex 调用中的每一个都收到此错误:

error C1067: too little data in type constructor

根据this documentation

GS 定义了这些顶点输出代表的图元类型。 GS 也可以通过调用 EndPrimitive() 函数来结束一个原语并开始一个新的。这不会发出顶点。

为了从一个GS写两个独立的三角形,你必须用EmitVertex()为前三个顶点写三个独立的顶点,然后调用EndPrimitive()来结束带并开始一个新的。然后你用 EmitVertex() 再写三个顶点。

我做错了什么?

【问题讨论】:

    标签: opengl glsl geometry-shader gl-triangle-strip


    【解决方案1】:

    在工作部分:

    gl_Position = transform * (c + vec4 (+s, -s, -s, 0));
    

    在非工作部分:

    gl_Position = transform * (c + vec4 (-s, -s, -s));
    

    正如错误消息告诉您的那样,vec4 构造函数需要四个组件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多