我正在设计一个使用内置变量gl_VertexID的着色器程序:
gl_VertexID - 包含当前顶点的索引
变量定义为 signed int 。为什么它不是unsigned int?当它与非常大的阵列(例如2 ^ 30长阵列)一起使用时会发生什么? GLSL是否将其视为unsigned int?
我想将其内容用作着色器的输出(例如将其写入输出FBO缓冲区)我将使用glReadPixels读取其内容,GL_RED_INTEGER作为格式,GL_INT或GL_UNSIGNED_INT作为类型。 哪一个是正确的?
如果我使用GL_INT,我将无法处理非常大的数组。
为了使用GL_UNSIGNED_INT,我可能会将生成的gl_VertexID强制转换为我的着色器中的uint但是又如何访问长数组?
答案 0 :(得分:1)
最有可能是历史原因。 gl_VertexID
首先被定义为EXT_gpu_shader4扩展的一部分。此扩展是基于OpenGL 2.0定义的:
此扩展是根据OpenGL着色语言规范的OpenGL 2.0规范和版本1.10.59编写的。
GLSL当时还不支持无符号类型。它们直到OpenGL 3.0才被引入。
答案 1 :(得分:0)
我不知道OpenGL是否可以将顶点id视为unsigned int,但您很可能创建自己的(完整的32位)ID。我前段时间通过指定rgba8888顶点颜色属性来完成此操作,该属性通过对r,g,b和组件进行位移来转换为着色器中的id。
这样做我也注意到这并不比使用gl_VertexID慢,这似乎引入了一些开销。现在只使用unsigned int属性。
另外,我想知道,你为什么要回读gl_VertexID? (我曾经为一个算法做了一次,结果却没有考虑过,现在已经被更高效的替换了;))