在three.js中使用gl_VertexID引起错误。

3
我一直在使用gl_VertexID内置的顶点索引,并通过“in”传递给Three.js,但是遇到了问题。我不确定为什么,因为文档中说它适用于所有版本的OpenGL。

http://www.opengl.org/sdk/docs/manglsl/xhtml/gl_VertexID.xml

我正在使用这个顶点着色器:
        uniform int freqData[64];
        uniform int fftSize;

        in int gl_VertexID;

        void main() {
            vec3 norm = normalize(position);

            int modFFT = mod(gl_VertexID, fftSize);

            vec3 newPosition = norm * float(freqData[modFFT]);

            gl_Position = projectionMatrix * modelViewMatrix * vec4( newPosition, 1.0 );
        }

我收到的错误信息是:
ERROR: 0:68: 'in' : 语法错误
它似乎有一个关于"in"声明的问题,但它没有抱怨任何其他事情(错误控制台能够检测到多个编译错误)。
非常感谢您的帮助,我正在使用昨天的Three.js版本。
2个回答

8
据我所知,在WebGL中,您无法访问内置的顶点索引。
但是,您可以通过提供自己的自定义属性流来模拟这一点,其设置为与此类内置索引流等效的值。
在three.js中,尚未实现整数自定义属性,因此您需要使用浮点属性。
请参阅此示例中的“位移”属性: http://mrdoob.github.com/three.js/examples/webgl_custom_attributes.html

太棒了!位移数组被映射到顶点属性属性,使用FFT数据...真的很酷,谢谢! - Alex

7
首先,无需声明gl_VertexID;它要么已经存在(感谢扩展,因为WebGL是基于OpenGL ES 2.0构建的,不提供此功能作为核心特性),要么不存在。
其次,WebGL是基于OpenGL ES 2.0构建的,不使用inout语法;这是给桌面端使用的OpenGL 3.0及以上版本的语法。GLSL ES使用较旧的attribute语法。因此,即使您需要声明gl_VertexID(再次强调,您不需要这样做),也需要将其称为attribute,而不是in

我的问题是,我试图为每个顶点在freqData中使用不同的fft数据索引。我已经尝试了许多其他方法,比如将tick作为属性传递,但它们是不可变的,所以没用。我该怎么做? - Alex
如果我在程序顶部声明一个int,我能够跨顶点递增它吗? - Alex
@AlexW:“如果我在程序顶部声明一个int,我可以跨顶点递增它吗?” 不行。如果你想要进行FFT,则使用WebCL;WebGL用于图形,而不是一般的计算任务。 - Nicol Bolas
我已经获得了我的FFT数据并将其传递给WebGL。感谢您的提醒,但我已经有了我的数据,我只需要从着色器程序中访问它。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接