首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GLSL Shader中VBO/VAO数据的存取

GLSL Shader中VBO/VAO数据的存取
EN

Stack Overflow用户
提问于 2015-10-09 06:14:56
回答 1查看 498关注 0票数 1

vertex shader中,如何使shader内的函数在将其顶点数据缓冲到VBO后访问特定的属性数组值

在下面的shader中,假设cmp()函数将统一变量与vertex i进行比较。

代码语言:javascript
复制
#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()以使其并行执行比较?

EN

回答 1

Stack Overflow用户

发布于 2015-10-09 11:20:23

根据着色器代码中的命名和问题的措辞,看起来您误解了顶点着色器的概念。

将为每个顶点调用一次顶点着色器。因此,当顶点着色器代码执行时,它始终在单个顶点上操作。这意味着您的in变量的名称具有误导性:

代码语言:javascript
复制
in vec2 vertices;

该变量提供着色器正在处理的一个也是唯一一个顶点的位置。因此,如果您使用单数形式的名称,可能会更清楚:

代码语言:javascript
复制
in vec2 vertex;

一旦你意识到你是在一个单独的顶点上操作,剩下的事情就变得很容易了。为了进行比较:

代码语言:javascript
复制
bool cmp() {
    return (cmp_vertex == vertex); 
}

顶点着色器通常已经并行调用,这意味着许多实例可以同时执行,每个实例都在其自己的顶点上。因此,在单个着色器实例中不需要并行。

你可能会在实现你想要的东西上遇到更多的问题。但我希望这至少能让你克服最初的障碍。

例如,以下out变量有问题:

代码语言:javascript
复制
out int isEqual;

顶点着色器的out变量在片段着色器中具有匹配的in变量。默认情况下,顶点着色器写入的值跨三角形进行线性插值,片段着色器获得插值的值。对于int类型的变量,这不受支持。它们只支持平面插值:

代码语言:javascript
复制
flat out int isEqual;

但这可能不会得到您想要的结果,因为您在碎片着色器中看到的值在整个三角形中始终相同。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33026835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档