【问题标题】:GLSL gl_PrimitiveID always 0GLSL gl_PrimitiveID 始终为 0
【发布时间】:2014-09-25 21:16:51
【问题描述】:

我正在尝试将 gl_PrimitiveID 作为片段着色器中的颜色输出。但是它总是等于 0。

这是我的片段着色器:

void main(void)
{
    if(gl_PrimitiveID == 0)
        gl_FragColor.rgba = vec4(1, 0, 0, 1); // red for 0
    else
        gl_FragColor.rgba = vec4(0, 0, 1, 1); // blue otherwise
}

和顶点着色器

void main(void)
{
    gl_Position = ftransform();
}

三角形的输出颜色始终为红色。 我正在使用 glDrawElements 绘制三角形,使用默认着色器时渲染正常。

我做错了什么?

这是我绘制三角形的方法:

glBindBuffer(GL_ARRAY_BUFFER, vertexPosBuffer);
glVertexPointer(3, GL_FLOAT, 0, NULL);

glBindBuffer(GL_ARRAY_BUFFER, vertexNormalBuffer);
glNormalPointer(GL_FLOAT, 0, NULL);

glEnableClientState( GL_VERTEX_ARRAY );
glEnableClientState( GL_NORMAL_ARRAY );

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBuffer);
glDrawElements(GL_TRIANGLES, countVertices, GL_UNSIGNED_INT, (void*)0);

【问题讨论】:

  • 您的其他着色器阶段在哪里?特别是几何,如果你有的话。
  • 要到达片段着色器,它必须在其他着色器中通过。您的着色器中是否还有任何编译链接错误?
  • @Andon 我将我的顶点着色器添加到原始帖子中。我没有任何几何着色器。
  • @ratchetfreak 如果不存在几何着色器,则gl_PrimitiveID 由实现填充。
  • @ratchetfreak 没有编译和链接错误。我不明白。 This documentation 表示 gl_PrimitiveID 是当前由 this 渲染的基元的索引。我假设 glDrawElements 是集合的一部分。但我错了或错过了一个 gl 电话。

标签: opengl glsl shader


【解决方案1】:

在我的头撞到墙上几个小时后,我意识到我的顶点着色器没有附加到正确的程序 ID。

仅附加了片段着色器。如果没有提供顶点着色器,gl_PrimitiveID 似乎不会自动递增。

+1 给安东和棘轮,为我指明了正确的方向。

【讨论】:

  • 我不知道你为什么被否决。尽管我对 OpenGL 有很多经验,但很容易忽略一些东西。无论如何,我赞成你,因为我发现你试图完成的事情非常有用。我使用gl_PrimitiveIDglobal 来引用对齐的整数数组,以更改每个多边形的着色器行为。为我节省了很多阅读文档的时间:-)
猜你喜欢
  • 2023-03-10
  • 2014-01-09
  • 1970-01-01
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-19
相关资源
最近更新 更多