- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在尝试编译片段着色器时遇到问题。我不断收到此错误:
Uncaught Error: Fragment Shader Compiler Error: ERROR: 0:21: '[' :
array index for gl_FragData must be constant zero ERROR: 0:21: '[' :
array index for gl_FragData must be constant zero ERROR: 0:21: '[' :
array index for gl_FragData must be constant zero
这是代码:
#ifdef GL_EXT_draw_buffers
#extension GL_EXT_draw_buffers : require
#endif
#ifdef GL_ES
precision highp float;
#endif
void main() {
gl_FragData[0] = vec4(1.,2.,3.,4.);
gl_FragData[1] = vec4(1.,2.,3.,4.);
gl_FragData[2] = vec4(1.,2.,3.,4.);
gl_FragData[3] = vec4(1.,2.,3.,4.);
}
如果我设置 gl_FragColor
(将 4 个纹理附加到帧缓冲区),整个设置工作正常,但尝试执行上面的代码(索引缓冲区以输出)似乎不编译。我已经看到这在使用扩展的 WebGL1 中运行良好。我正在使用 WebGL2,所以在这种情况下可能有些不同? (我正在最新版本的 Chrome 中尝试)。
最佳答案
所以看起来从 WebGL1 到 WebGL2 需要考虑一些变化。鉴于@gman 的评论,我认为最好链接到他的文章,因为我知道他真的是这里的专家。 ;)
WebGL 1 到 WebGL 2 的转换:https://webgl2fundamentals.org/webgl/lessons/webgl1-to-webgl2.html
我还发现记住版本 differences 很有帮助:
WebGL 1.0 is based on OpenGL ES 2.0 and provides an API for 3D graphics. It uses the HTML5 canvas element and is accessed using Document Object Model (DOM) interfaces.
WebGL 2.0 is based on OpenGL ES 3.0 and made guaranteed availability of many optional extensions of WebGL 1.0 and exposes new APIs.
简而言之(也指历史上的第一个链接):
我的着色器代码是为我见过的使用扩展的 WebGL 1 (OpenGL ES 2) 示例设计的。这很好用,因为 OpenGL 2.0 通过 gl_FragData
支持多个颜色值。
切换到 WebGL 2 (OpenGL ES 3) 这已被弃用,取而代之的是一种不同的方式。现在需要 out
声明,例如 out vec4 out_0;主要(无效){ out_0 = vec4(1.0,0.0,0.0,1.0); }
。但我仍然遇到了一些问题。看来我需要指定缓冲区位置。另外,我收到了这个错误:
ERROR: must explicitly specify all locations when using multiple fragment outputs
这意味着我需要将 #version 300 es
添加到我的程序的顶部,因此 WebGL 2 的正确代码看起来更像这样:
#version 300 es
layout(location = 0) out vec4 out_0;
layout(location = 1) out vec4 out_1;
main(void) {
out_0 = vec4(1.0, 0.0, 0.0, 1.0);
out_1 = vec4(1.0, 0.0, 0.0, 1.0);
}
有一次我的版本不对,导致了这个错误:
invalid version directive ERROR: 0:24: 'out' : storage qualifier supported in GLSL ES 3.00 and above only
但我发现 WebGL 2 的版本特别是 #version 300 es
(注意 es
部分),它有效!
注意:版本说明符必须在第一行,不幸的是,它不能在预处理器指令中(即 #ifdef
),所以我必须在将其发送到之前动态更改字符串被编译。如果没有,你会得到这个:
#version directive must occur before anything else, except for comments and white space
对于顶点着色器,如果为 WebGL 2 (ES 3) 编译,请注意 attribute
现在是 in
。顶点着色器的版本也必须与正在编译的片段的版本相匹配,否则你会得到这个:
ERROR: Shader Linking Error: Versions of linked shaders have to match.
我希望将所有这些困惑粘合在一起可以帮助其他人节省大量时间。 ;)
关于webgl - gl_FragData 必须为常量零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46740817/
我在尝试编译片段着色器时遇到问题。我不断收到此错误: Uncaught Error: Fragment Shader Compiler Error: ERROR: 0:21: '[' : array
从我在网上看到的几个例子来看,gl_FragData[0] 被假定为一个颜色缓冲区。我试图找到gl_FragData中每个索引的含义,并从OpenGL Shading language book(橙皮
正如 jar 头上所说:是否有任何理由使用 gl_FragColor 而不是 gl_FragData[0]?如果不是,那么为什么gl_FragColor存在呢?它仅仅是 gl_FragData 不存在
用three.js,我想延迟着色,但是效果不好。它不接收 gl_fragData 的值。你要么知道有人解决方案。 一个 着色器代码 //shader1 #extension GL_EXT_draw_
我是一名优秀的程序员,十分优秀!