Opengl 属性位置\u VS\u in绑定到通用属性0,但也使用gl\u顶点

Opengl 属性位置\u VS\u in绑定到通用属性0,但也使用gl\u顶点,opengl,glsl,lwjgl,Opengl,Glsl,Lwjgl,我尝试使用四个着色器:顶点着色器(VS)、细分控制着色器(TCS)、细分评估着色器(TES)和片段着色器(FS) 但是,当我尝试加载这些着色器时,会得到: 这一直是最令人困惑的,我已经花了几个小时试图解决它。然而,我在代码中的任何地方都看不到“gl_顶点”,所以我真的被卡住了。我甚至不知道哪个着色器是问题所在 下面是我当前加载着色器的代码(看起来很多,但实际上都是重复的代码,只是略有更改): 以下是我的着色器: VS: TCS: 财政司司长: 在视图空间中改变vec4位置; 均匀的二维颜色和纹

我尝试使用四个着色器:顶点着色器(VS)、细分控制着色器(TCS)、细分评估着色器(TES)和片段着色器(FS)

但是,当我尝试加载这些着色器时,会得到:

这一直是最令人困惑的,我已经花了几个小时试图解决它。然而,我在代码中的任何地方都看不到“gl_顶点”,所以我真的被卡住了。我甚至不知道哪个着色器是问题所在

下面是我当前加载着色器的代码(看起来很多,但实际上都是重复的代码,只是略有更改):

以下是我的着色器: VS:

TCS:

财政司司长:

在视图空间中改变vec4位置;
均匀的二维颜色和纹理;
void main()
{
浮动距离=距离(视图空间中的位置),
vec4(0.0,0.0,0.0,1.0));
如果(距离<1000.0)
{
gl_FragColor=gl_颜色;
//近原点颜色
}
其他的
{
gl_FragColor=gl_颜色;
//杀戮;
//丢弃;
//gl_FragColor=vec4(0.3,0.3,0.3,1.0);
//远离原点的颜色
}
}
如果出于任何原因,我的电脑支持OpenGL 4.0(包括OpenGL 4.0)


由于我无法确定我应该如何使用一行我没有使用的代码,我希望你们中的一位能够诊断出这个问题。

嗯,错误消息非常清楚,原因如下:

layout (location = 0) in vec3 Position_VS_in;
[...]
gl_Position = ftransform();
fttransform
是一个传统函数,它使用传统bultin顶点位置属性
gl_vertex
根据传统bultin矩阵变换顶点

GL规范还要求通用顶点属性0为旧内置的
GL_顶点
别名,因此属性索引0被此项阻止,您不得为此项分配其他属性

现在完全不清楚为什么在这里使用
fttransform
。看起来你根本不想那样。但我不能肯定这一点。但它肯定不会那样做。在我看来,你根本不应该使用那些不受欢迎的东西

更新1

请注意,
fttransform
在原理上等同于
gl\u ModelViewProjectionMatrix*gl\u Vertex
,由于
gl\u模型视图投影矩阵
是一个内置的统一体,表示为
gl\u投影
gl\u模型视图
设置的矩阵的乘积
P*MV
,使用同样不推荐使用的gl矩阵堆栈,和
gl\u顶点
是内置的顶点位置属性集,具有
glVertex…
/
glvertexinter
/
glvertexattributepointer(0…)
。两者都可以由用户定义的属性/制服替换


使用
ftTransform
的唯一一个缺点是,对于相同的输入,它还保证获得与使用固定函数管道渲染完全相同的结果。这对于多过程算法非常有用,其中一些过程需要使用着色器进行渲染,而另一些过程使用固定函数pipelinew。之所以需要这样一个函数,是因为在没有着色器的情况下进行渲染时,如果着色器没有使用与GL实现完全相同的公式,则可能会有轻微的数值差异。

在我接受您的问题之前,请您告诉我ftTransform()的合适替代方案?谢谢现在java正在崩溃,但我将为这个问题制作另一个线程。非常感谢所有的帮助!
layout (location = 0) in vec3 Position_VS_in;
layout (location = 1) in vec2 TexCoord_VS_in;
layout (location = 2) in vec3 Normal_VS_in;

uniform mat4 gWorld;

out vec3 WorldPos_CS_in;
out vec2 TexCoord_CS_in;
out vec3 Normal_CS_in;

void main()
{
WorldPos_CS_in = (gWorld * vec4(Position_VS_in, 1.0)).xyz;
TexCoord_CS_in = TexCoord_VS_in;
Normal_CS_in = (gWorld * vec4(Normal_VS_in, 0.0)).xyz;
gl_Position = ftransform();
}
// define the number of CPs in the output patch
 layout (vertices = 3) out;

uniform vec3 gEyeWorldPos;

// attributes of the input CPs
in vec3 WorldPos_CS_in[];
in vec2 TexCoord_CS_in[];
in vec3 Normal_CS_in[];

 // attributes of the output CPs
out vec3 WorldPos_ES_in[];
out vec2 TexCoord_ES_in[];
out vec3 Normal_ES_in[];

float GetTessLevel(float Distance0, float Distance1)
{
float AvgDistance = (Distance0 + Distance1) / 2.0;

if (AvgDistance <= 2.0) {
    return 10.0;
}
else if (AvgDistance <= 5.0) {
    return 7.0;
}
else {
    return 3.0;
}
}

void main()
{
// Set the control points of the output patch
TexCoord_ES_in[gl_InvocationID] = TexCoord_CS_in[gl_InvocationID];
Normal_ES_in[gl_InvocationID] = Normal_CS_in[gl_InvocationID];
WorldPos_ES_in[gl_InvocationID] = WorldPos_CS_in[gl_InvocationID];
// Calculate the distance from the camera to the three control points
float EyeToVertexDistance0 = distance(gEyeWorldPos, WorldPos_ES_in[0]);
float EyeToVertexDistance1 = distance(gEyeWorldPos, WorldPos_ES_in[1]);
float EyeToVertexDistance2 = distance(gEyeWorldPos, WorldPos_ES_in[2]);

// Calculate the tessellation levels
gl_TessLevelOuter[0] = GetTessLevel(EyeToVertexDistance1, EyeToVertexDistance2);
gl_TessLevelOuter[1] = GetTessLevel(EyeToVertexDistance2, EyeToVertexDistance0);
gl_TessLevelOuter[2] = GetTessLevel(EyeToVertexDistance0, EyeToVertexDistance1);
gl_TessLevelInner[0] = gl_TessLevelOuter[2];
}
layout(triangles, equal_spacing, ccw) in;

uniform mat4 gVP;
uniform sampler2D gDisplacementMap;
uniform float gDispFactor;

in vec3 WorldPos_ES_in[];
in vec2 TexCoord_ES_in[];
in vec3 Normal_ES_in[];

out vec3 WorldPos_FS_in;
out vec2 TexCoord_FS_in;
out vec3 Normal_FS_in;

vec2 interpolate2D(vec2 v0, vec2 v1, vec2 v2)
{
return vec2(gl_TessCoord.x) * v0 + vec2(gl_TessCoord.y) * v1 + vec2(gl_TessCoord.z) * v2;
}

vec3 interpolate3D(vec3 v0, vec3 v1, vec3 v2)
{
return vec3(gl_TessCoord.x) * v0 + vec3(gl_TessCoord.y) * v1 + vec3(gl_TessCoord.z) * v2;
}

void main()
{  
// Interpolate the attributes of the output vertex using the barycentric coordinates
TexCoord_FS_in = interpolate2D(TexCoord_ES_in[0], TexCoord_ES_in[1], TexCoord_ES_in[2]);
Normal_FS_in = interpolate3D(Normal_ES_in[0], Normal_ES_in[1], Normal_ES_in[2]);
Normal_FS_in = normalize(Normal_FS_in);
WorldPos_FS_in = interpolate3D(WorldPos_ES_in[0], WorldPos_ES_in[1], WorldPos_ES_in[2]);
// Displace the vertex along the normal
float Displacement = texture(gDisplacementMap, TexCoord_FS_in.xy).x;
WorldPos_FS_in += Normal_FS_in * Displacement * gDispFactor;
gl_Position = gVP * vec4(WorldPos_FS_in, 1.0);
}
varying vec4 position_in_view_space;
uniform sampler2D color_texture;

     void main()
     {
        float dist = distance(position_in_view_space, 
           vec4(0.0, 0.0, 0.0, 1.0));
        if (dist < 1000.0)
        {
            gl_FragColor = gl_Color;
              // color near origin
        }
        else
        {
        gl_FragColor = gl_Color;
           //kill;
           //discard;
           //gl_FragColor = vec4(0.3, 0.3, 0.3, 1.0); 
              // color far from origin
        }
     }
layout (location = 0) in vec3 Position_VS_in;
[...]
gl_Position = ftransform();