在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()以使其并行执行比较?
发布于 2015-10-09 11:20:23
根据着色器代码中的命名和问题的措辞,看起来您误解了顶点着色器的概念。
将为每个顶点调用一次顶点着色器。因此,当顶点着色器代码执行时,它始终在单个顶点上操作。这意味着您的in变量的名称具有误导性:
in vec2 vertices;该变量提供着色器正在处理的一个也是唯一一个顶点的位置。因此,如果您使用单数形式的名称,可能会更清楚:
in vec2 vertex;一旦你意识到你是在一个单独的顶点上操作,剩下的事情就变得很容易了。为了进行比较:
bool cmp() {
return (cmp_vertex == vertex);
}顶点着色器通常已经并行调用,这意味着许多实例可以同时执行,每个实例都在其自己的顶点上。因此,在单个着色器实例中不需要并行。
你可能会在实现你想要的东西上遇到更多的问题。但我希望这至少能让你克服最初的障碍。
例如,以下out变量有问题:
out int isEqual;顶点着色器的out变量在片段着色器中具有匹配的in变量。默认情况下,顶点着色器写入的值跨三角形进行线性插值,片段着色器获得插值的值。对于int类型的变量,这不受支持。它们只支持平面插值:
flat out int isEqual;但这可能不会得到您想要的结果,因为您在碎片着色器中看到的值在整个三角形中始终相同。
https://stackoverflow.com/questions/33026835
复制相似问题