在GLSL着色器中访问VBO / VAO数据

时间:2015-10-08 22:14:56

标签: opengl vertex-shader vertex-buffer

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()以便它并行进行比较吗?

1 个答案:

答案 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;

但这可能不会为您提供您所追求的内容,因为您在片段着色器中看到的值在整个三角形中始终是相同的。