Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL在顶点着色器中查找“在vec3 vert中”,但不查找“在float val中”_C_Opengl_Shader_Fragment Shader_Vertex Shader - Fatal编程技术网

OpenGL在顶点着色器中查找“在vec3 vert中”,但不查找“在float val中”

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

我有一些代码,通过几何体着色器传递点来绘制正方形。我构造了一个由3个浮点数组成的数组,将其绑定到我的顶点着色器的
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();
}