【问题标题】:How to access Vertex Indices in Fragment Shader GLSL如何在片段着色器 GLSL 中访问顶点索引
【发布时间】:2014-11-08 03:48:32
【问题描述】:

我正在使用 OpenGL 绘制索引 GL_LINES。我需要访问片段着色器中两个顶点的索引。因此,我需要知道我的行包含的两个索引。我阅读了关于内置变量 gl_VertexID 的信息,这在这里应该没有太大帮助。由于我已经将索引存储在某个缓冲区中,因此我也尝试将它们作为属性传递。 因此我的代码如下所示:

glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER,vertexBuffer);
glVertexAttribPointer(0,2,GL_FLOAT,GL_FALSE,0,(void*)0);

glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER,indexBuffer);
glVertexAttribPointer(1,2,GL_UNSIGNED_INT,GL_FALSE,0,(void*)0);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,indexBuffer);

使用这似乎是错误的方式,对吧? 此外,我使用索引通过图像加载存储原子地写入一些信息。不幸的是,通过 glGetTexImage 获取此图像只会产生零。 所以我的索引传递或我的图像写入/获取似乎是错误的。

我很乐意在这里提供任何帮助。

【问题讨论】:

  • 使用索引缓冲区内容也作为属性数据是行不通的,因为现在你的索引也将成为索引数组的索引,所以你得到完全错误的索引作为每个顶点的属性.

标签: opengl glsl fragment-shader indices


【解决方案1】:

对于顶点着色器中具有整数类型的属性,您需要使用glVertexAttribIPointer()(注意附加的I)而不是glVertexAttribPointer()

由于每个顶点只有一个索引,因此第二个参数(即大小)应该为 1。调用将如下所示:

glVertexAttribIPointer(1, 1, GL_UNSIGNED_INT, 0, (void*)0);

您所做的似乎有些不寻常,但我想不出为什么使用索引数组作为顶点属性是非法的。

我相信gl_VertexID只是draw命令产生的顶点的顺序id,与顶点索引不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    相关资源
    最近更新 更多