OpenGL在顶点着色器中查找“在vec3 vert中”,但不查找“在float val中”
我有一些代码,通过几何体着色器传递点来绘制正方形。我构造了一个由3个浮点数组成的数组,将其绑定到我的顶点着色器的OpenGL在顶点着色器中查找“在vec3 vert中”,但不查找“在float val中”,c,opengl,shader,fragment-shader,vertex-shader,C,Opengl,Shader,Fragment Shader,Vertex Shader,我有一些代码,通过几何体着色器传递点来绘制正方形。我构造了一个由3个浮点数组成的数组,将其绑定到我的顶点着色器的in vec3 vert属性,一切正常 但是,我想添加另一个浮动,片段着色器将使用它来计算颜色。这在顶点着色器(要通过)中作为float val中的。尽管能够找到vert,glGetAttribLocation却找不到val(get\u program\u attrib():未找到Atrrib val(-1)) 代码: 片段着色器: #version 150 in float val
in vec3 vert
属性,一切正常
但是,我想添加另一个浮动,片段着色器将使用它来计算颜色。这在顶点着色器(要通过)中作为float val中的。尽管能够找到vert
,glGetAttribLocation
却找不到val
(get\u program\u attrib():未找到Atrrib val(-1)
)
代码:
片段着色器:
#version 150
in float value;
out vec4 color;
void main() {
color = vec4(value, 0, 0, 1);
}
几何体着色器:
#version 150
layout (points) in;
layout (triangle_strip, max_vertices=4) out;
uniform float square_size;
void main() {
vec4 position = gl_in[0].gl_Position;
gl_Position = vec4(position.x, position.y, position.zw);
EmitVertex();
gl_Position = vec4(position.x, position.y + square_size, position.zw);
EmitVertex();
gl_Position = vec4(position.x + square_size, position.y, position.zw);
EmitVertex();
gl_Position = vec4(position.x + square_size, position.y + square_size, position.zw);
EmitVertex();
EndPrimitive();
}
使用几何体着色器时,顶点着色器输出不会直接传递到片段着色器
这就是你所有问题的根源。要使顶点属性处于活动状态,它必须有助于程序的最终输出。基本上,这意味着碎片着色器中的计算必须基于它
不幸的是,这种情况现在没有发生。有一个名为value
的变量从顶点着色器输出,还有一个名为value
的变量由片段着色器输入。由于几何体着色器位于两者之间,因此片段着色器仅在几何体着色器中查找名为value
的输出——不存在此类输出
当然,您可能会认为解决方案是在几何体着色器中创建一个名为value
的变量,作为输入和输出。但是,这将不起作用,您必须声明它inout value
,这是无效的
以下是必要的更正:
顶点着色器:
片段着色器:
几何体着色器:
您可能会问,当值为常量时,我为什么分配了4次value\u geo
。这是因为EmitVertex(…)
会导致所有输出变量在返回时变为未定义,因此每次都必须对其进行设置。使用几何体着色器时,顶点着色器输出不会直接传递到片段着色器
这就是你所有问题的根源。要使顶点属性处于活动状态,它必须有助于程序的最终输出。基本上,这意味着碎片着色器中的计算必须基于它
不幸的是,这种情况现在没有发生。有一个名为value
的变量从顶点着色器输出,还有一个名为value
的变量由片段着色器输入。由于几何体着色器位于两者之间,因此片段着色器仅在几何体着色器中查找名为value
的输出——不存在此类输出
当然,您可能会认为解决方案是在几何体着色器中创建一个名为value
的变量,作为输入和输出。但是,这将不起作用,您必须声明它inout value
,这是无效的
以下是必要的更正:
顶点着色器:
片段着色器:
几何体着色器:
您可能会问,当值为常量时,我为什么分配了4次value\u geo
。这是因为EmitVertex(…)
会导致所有输出变量在返回时变为未定义,因此每次都必须对其进行设置。使用几何体着色器时,顶点着色器输出不会直接传递到片段着色器
这就是你所有问题的根源。要使顶点属性处于活动状态,它必须有助于程序的最终输出。基本上,这意味着碎片着色器中的计算必须基于它
不幸的是,这种情况现在没有发生。有一个名为value
的变量从顶点着色器输出,还有一个名为value
的变量由片段着色器输入。由于几何体着色器位于两者之间,因此片段着色器仅在几何体着色器中查找名为value
的输出——不存在此类输出
当然,您可能会认为解决方案是在几何体着色器中创建一个名为value
的变量,作为输入和输出。但是,这将不起作用,您必须声明它inout value
,这是无效的
以下是必要的更正:
顶点着色器:
片段着色器:
几何体着色器:
您可能会问,当值为常量时,我为什么分配了4次value\u geo
。这是因为EmitVertex(…)
会导致所有输出变量在返回时变为未定义,因此每次都必须对其进行设置。使用几何体着色器时,顶点着色器输出不会直接传递到片段着色器
这就是你所有问题的根源。要使顶点属性处于活动状态,它必须有助于程序的最终输出。基本上,这意味着碎片着色器中的计算必须基于它
不幸的是,这种情况现在没有发生。有一个名为value
的变量从顶点着色器输出,还有一个名为value
的变量由片段着色器输入。由于几何体着色器位于两者之间,因此片段着色器仅在几何体着色器中查找名为value
的输出——不存在此类输出
当然,您可能会认为解决方案是在几何体着色器中创建一个名为value
的变量,作为输入和输出。但是,这将不起作用,您必须声明它inout value
,这是无效的
以下是必要的更正:
顶点着色器:
片段着色器:
几何体着色器:
你可能会问我为什么分配value\u geo#version 150
in float value;
out vec4 color;
void main() {
color = vec4(value, 0, 0, 1);
}
#version 150
layout (points) in;
layout (triangle_strip, max_vertices=4) out;
uniform float square_size;
void main() {
vec4 position = gl_in[0].gl_Position;
gl_Position = vec4(position.x, position.y, position.zw);
EmitVertex();
gl_Position = vec4(position.x, position.y + square_size, position.zw);
EmitVertex();
gl_Position = vec4(position.x + square_size, position.y, position.zw);
EmitVertex();
gl_Position = vec4(position.x + square_size, position.y + square_size, position.zw);
EmitVertex();
EndPrimitive();
}
#version 150
in vec3 vert;
in float val;
out float value_vtx; // Output is fed to the Geometry Shader
void main() {
gl_Position = vec4(vert, 1);
value_vtx = val;
}
#version 150
in float value_geo; // Takes its input from the Geometry Shader
out vec4 color;
void main() {
color = vec4(value_geo, 0, 0, 1);
}
#version 150
layout (points) in;
layout (triangle_strip, max_vertices=4) out;
uniform float square_size;
in float value_vtx []; // This was output by the vertex shader
out float value_geo; // This will be the input to the fragment shader
void main() {
vec4 position = gl_in[0].gl_Position;
gl_Position = vec4(position.x, position.y, position.zw);
value_geo = value_vtx[0];
EmitVertex();
gl_Position = vec4(position.x, position.y + square_size, position.zw);
value_geo = value_vtx[0];
EmitVertex();
gl_Position = vec4(position.x + square_size, position.y, position.zw);
value_geo = value_vtx[0];
EmitVertex();
gl_Position = vec4(position.x + square_size, position.y + square_size, position.zw);
value_geo = value_vtx[0];
EmitVertex();
EndPrimitive();
}