在vertex shader
中,如果shader
中的函数在将其顶点数据缓冲到VBO
之后如何访问特定属性数组值?
在shader
下面,cmp()
函数应该将统一变量与vertex i
进行比较。
#version 150 core
in vec2 vertices;
in vec3 color;
out vec3 Color;
uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;
uniform vec2 cmp_vertex; // Vertex to compare
out int isEqual; // Output variable for cmp()
// Comparator
vec2 cmp(){
int i = 3;
return (cmp_vertex == vertices[i]);
}
void main() {
Color = color;
gl_Position = projection * view * model * vec4(vertices, 0.0, 1.0);
isEqual = cmp();
}
另外,可以修改cmp()
以便它并行进行比较吗?
答案 0 :(得分:1)
根据着色器代码中的命名以及问题的措辞,看起来您误解了顶点着色器的概念。
为每个顶点调用一次顶点着色器。因此,当您的顶点着色器代码执行时,它始终在单个顶点上运行。这意味着您的in
变量的名称具有误导性:
in vec2 vertices;
此变量为您提供着色器正在处理的唯一顶点的位置。因此,如果您使用单数形式的名称,可能会更清楚:
in vec2 vertex;
一旦你意识到你在一个顶点上操作,剩下的就变得容易了。为了比较:
bool cmp() {
return (cmp_vertex == vertex);
}
顶点着色器通常已经并行调用,这意味着许多实例可以同时执行,每个实例都在自己的顶点上执行。因此,在单个着色器实例中不需要并行性。
您可能会遇到更多问题,实现您所追求的目标。但我希望这至少可以让你在最初的障碍中获得成功。
例如,以下out
变量存在问题:
out int isEqual;
顶点着色器的 out
个变量在片段着色器中具有匹配的in
变量。默认情况下,顶点着色器写入的值跨三角形线性插值,片段着色器获取插值。 int类型的变量不支持此功能。它们只支持平面插值:
flat out int isEqual;
但这可能不会为您提供您所追求的内容,因为您在片段着色器中看到的值在整个三角形中始终是相同的。