1

帧缓冲区附件有问题。基本上,我的帧缓冲区一直工作得很好,但对于我的上一个项目,我需要用一些颜色值初始化它们。所以我创建了一个带有纹理的附件,其中包含了我想要的颜色值。这导致了一些(对我来说)无法解释的行为,你可以在下面的代码中看到,我创建了一个带有附件的帧缓冲区,然后有一个着色器将一个非常简单的形状渲染到帧缓冲区中,另一个着色剂读取值,并在读取位置添加一些噪波。

奇怪的是

  • 读数似乎到处都是,如果您删除源代码中的帧缓冲区附件(只需注释掉这些行,以便在数组中保留一个空对象),您将看到它的样子(请注意嘈杂的边缘,因此写入帧缓冲区和读取帧缓冲区的工作与预期一样)。

    相反,它看起来像这样:

  • 此外,更改附件纹理的值也会更改结果,这很奇怪,因为我在写入之前从未从帧缓冲区中读取过。似乎大多数情况下,读取结果都会返回初始颜色值(在本例中为灰色)。

  • 如果删除噪声项或附加恒定噪声项(与位置无关),则读数似乎工作正常。

(函数main(){const dim=[512512];twgl.setDefaults({attribPrefix:“a_”});const gl=twgl.getContext(document.querySelector(“canvas”));gl.canvas.width=尺寸[0];gl.canvas.height=尺寸[1];const bfi=twgl.primitives.createXYQuadBufferInfo(gl);常量pgi={交叉:twgl.createProgramInfo(gl,[“vs”,“fs_cross”]),噪音:twgl.createProgramInfo(gl,[“vs”,“fs_noise”])};const fbi=twgl.createFramebuffer信息(全球,[{附件:twgl.createTexture(gl{src:数组(dim[0]*dim[1]).fill([128,128,0,0]).flat()})}],…暗淡);(功能框架(){twgl.bindFramebufferInfo(gl,fbi);gl.useProgram(pgi.cross.program);twgl.set制服(pgi.cross{u_resolution:暗});twgl.setBuffersAndAttributes(gl,pgi.cross,bfi);twgl.drawBufferInfo(gl,bfi);twgl.bindFramebufferInfo(gl,null);gl.useProgram(pgi.noise.program);twgl.setUniforms(pgi.noise{u_framebuffer:fbi.附件[0],u_pi:数学。圆周率,u_resolution:暗,u_seed:数组(24).fill().map(Math.random)});twgl.setBuffersAndAttributes(gl,pgi.noise,bfi);twgl.drawBufferInfo(gl,bfi);window.requestAnimationFrame(帧);})();})();
<script src=“https://twgljs.org/dist/4.x/twgl-full.min.js“></script><script id=“vs”type=“x-shader/x-vertex”>属性vec4 a_position;属性vec2 a_texcoord;可变vec2 v_texcoord;空main(){v_texcoord=a_texcord;gl_Position=位置;}</脚本><script id=“fs_cross”type=“x-shader/x-fragment”>高精度浮点;可变vec2 v_texcoord;均匀vec2 u_resolution;空main(){if(符号(v_texcoord.x-0.5)*符号(v.texcoord.y-0.5)<0.0){gl_FragColor=vec4(0.0,0.0,0.0,1.0);}其他{gl_FragColor=vec4(1.0、1.0、1.0和1.0);}}</脚本><script id=“fs_noise”type=“x-shader/x-fragment”>高精度浮点;可变vec2 v_texcoord;统一采样r2D u_framebuffer;均匀浮动u_pi;均匀vec2 u_resolution;均匀vec2 u_seed[12];vec2正常(vec2-uv){float scl=平方英尺(-2.0*log(uv.x));浮点数ang=2.0*u_pi*uv.y;返回vec2(scl*cos(ang),scl*sin(ng));}vec2噪声样本(取样器2D tex,vec2坐标){vec2总和=vec2(0.0,0.0);vec2-uni=vec2(0.0,0.0);对于(int i=0;i<6;i++){uni=分数(uni+vec2(点(gl_FragCoord.xy+sin(gl_FracgCoord.xml),u_seed[i]),点(gl_FragCoord.xy+sin(gl_FracgCoord.xml),u_seed[i+6])));vec2 nc=坐标+正常(uni)/u_resolution;sum+=纹理2D(u_framebuffer,nc).rg;}回报总额/6.0;}空main(){vec2 tmp=噪声样本(u_framebuffer,v_texcoord);gl_FragColor=vec4(tmp,0.5,1.0);}</脚本><画布>

4
  • 我真的不知道这里有什么问题。在采样坐标中添加一些噪波,就会得到噪波输出。在显示时添加一些蓝色,读数不会显示任何灰色imho。 2021年9月19日10:55
  • 我不将噪声添加到采样值,而只是添加到采样的位置,所以在第一张图像中,只有正方形之间的边缘有噪声,而不是正方形的中心。
    – 弗韦
    2021年9月19日10:56
  • 是的,我确实理解第一部分。但是,您是否尝试过存储生成的偏移并对其进行检查?你确定噪声算法的表现与预测相符吗?如果它产生了非常大的偏移,那么你会得到到处都是的值。如果只禁用噪波部分,并将偏移量硬编码为合理的值,则会得到预期的结果。我认为问题根本不在帧缓冲区设置中。 2021年9月19日11:06
  • 是的,我做到了。此外,第一个图像是由完全相同的程序生成的,只是没有帧缓冲区附件。您只需注释掉这些行(以便在数组中保留一个空对象)并查看结果。
    – 弗韦
    2021年9月19日11:11

0

重置为默认值

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.