几何体通过着色器不显示任何内容,但是仅使用碎片和顶点着色器确实会显示我正在绘制的内容

本文关键字:显示 顶点 绘制 任何内 几何体 碎片 | 更新日期: 2023-09-27 17:56:04

这是我制作的几何着色器,根据我的理解,它应该简单地将 3 个顶点传递给碎片着色器?当我删除几何着色器并将值直接传递给碎片着色器时,它可以工作并显示我想要的内容。我正在用三角形绘制地形,每次绘制调用都会通过 6 个顶点(2 个三角形),也许这与它有关,但我无法弄清楚是什么

#version 330
layout(triangles) in;
layout(triangle_strip, max_vertices = 3)out;

in float gHeight;
in vec4 gSurfacePosition;
in float gTerrainHeight;
in vec2 gTexCoords[3];
in vec4 gNormal[3];

out float oTerrainHeight;
out float oHeight;
out vec4 oNormal;
out vec4 oSurfacePosition;
out vec2 oTexCoords;

void main()
{
    oSurfacePosition=gSurfacePosition;
    oHeight=gHeight;
    oTerrainHeight=gTerrainHeight;
    for(int i = 0; i < 3; i++)
    {
        gl_Position = gl_in[i].gl_Position;
        oNormal = gNormal[i];
        oTexCoords = gTexCoords[i];
        EmitVertex();
    }
}

几何体通过着色器不显示任何内容,但是仅使用碎片和顶点着色器确实会显示我正在绘制的内容

in float gHeight;
in vec4 gSurfacePosition;
in float gTerrainHeight;

这不应该编译。要么您没有正确检查错误,要么您的实施在报告错误方面非常松懈。

这不应该编译的原因是所有 GS 输入都必须排列。基元中的每个顶点都有一个输入值。您的 GS 将triangles作为输入,因此它将每个输入值作为 3 个值的数组获取。你对某些输入执行了此操作,但并未对所有输入执行此操作。

oSurfacePosition=gSurfacePosition;
oHeight=gHeight;
oTerrainHeight=gTerrainHeight;

这不会做你认为它做的事情。每次调用 EmitVertex 时,所有out变量的值都变得未定义。因此,每次要发出新顶点时,都必须重新设置out变量。即使要写入相同的值,也必须每次都设置它。