代码之家  ›  专栏  ›  技术社区  ›  user3162781

着色器两个输出反馈

  •  1
  • user3162781  · 技术社区  · 7 年前

    我想从着色器中获得两个输出,然后将它们反馈到着色器中,用作迭代器och累加器。这对于默认的“通道”很好,但对于两个。。。因此,以下是着色器:

    #version 420
    uniform sampler2DRect inData0;
    uniform sampler2DRect inData1;
    out float outData0;
    out float outData1;
    void main(void)
    {
       outData0 = 1 + texture(inData0, gl_FragCoord.xy).r;
       outData1 = -1 + texture(inData1, gl_FragCoord.xy).r;
    }
    

    #version 420
    in vec2 position;
    void main()
    {
       gl_Position = vec4(position, 0, 1);
    }
    

    然后是标准的东西

        Int32 frameBufferId = GL.GenFramebuffer();
        GL.BindFramebuffer(FramebufferTarget.Framebuffer, frameBufferId);
    
        Int32 textureId0 = GL.GenTexture();
        GL.ActiveTexture(TextureUnit.Texture0);
        GL.BindTexture(TextureTarget.TextureRectangle, textureId0);
        GL.TexImage2D(TextureTarget.TextureRectangle, 0, PixelInternalFormat.R32f, 1024, 1024, 0, PixelFormat.Red, PixelType.Float, new Single[1024 * 1024]);
        GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0, TextureTarget.TextureRectangle, textureId0, 0);
    
        Int32 textureId1 = GL.GenTexture();
        GL.ActiveTexture(TextureUnit.Texture1);
        GL.BindTexture(TextureTarget.TextureRectangle, textureId1);
        GL.TexImage2D(TextureTarget.TextureRectangle, 0, PixelInternalFormat.R32f, 1024, 1024, 0, PixelFormat.Red, PixelType.Float, new Single[1024 * 1024]);
        GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment1, TextureTarget.TextureRectangle, textureId1, 0);
    
        GL.TexParameter(TextureTarget.TextureRectangle, TextureParameterName.TextureMinFilter, (Int32)TextureMinFilter.Linear);
    
        Single[] arrayBufferData = new Single[4 * 2] { -1, -1, 1, -1, 1, 1, -1, 1 };
    
        Int32 arrayBufferId = GL.GenBuffer();
        GL.BindBuffer(BufferTarget.ArrayBuffer, arrayBufferId);
        GL.BufferData(BufferTarget.ArrayBuffer, new IntPtr(4 * 2 * sizeof(Single)), arrayBufferData, BufferUsageHint.StaticDraw);
        Int32 positionId = GL.GetAttribLocation(programId, "position");
        GL.EnableVertexAttribArray(positionId);
        GL.VertexAttribPointer(positionId, 2, VertexAttribPointerType.Float, false, 0, 0);
        GL.Viewport(0, 0, 1024, 1024);
    

    所以,这就是我成功的地方

        Single[] result = new Single[1024 * 1024];
    
        GL.**DrawBuffers**(2, new DrawBuffersEnum[] { DrawBuffersEnum.ColorAttachment0, DrawBuffersEnum.ColorAttachment1 });
        GL.DrawArrays(PrimitiveType.Quads, 0, 4);
    
        GL.**ReadBuffer**(ReadBufferMode.ColorAttachment0);
        GL.ReadPixels(0, 0, 1024, 1024, PixelFormat.Red, PixelType.Float, result);
    
        GL.**ReadBuffer**(ReadBufferMode.ColorAttachment1);
        GL.ReadPixels(0, 0, 1024, 1024, PixelFormat.Red, PixelType.Float, result);
    

    这给了我两个正确的输出。对于一个“通道”,我会再次调用DrawArrays,它会将output0馈送到input0,但这里我希望output1也馈送到input1。这可行吗?此R32f/红色用于测试——它们将被vec4替代。

    编辑: 改变:

    layout(binding = 0) uniform sampler2DRect inData0
    layout(binding = 1) uniform sampler2DRect inData1
    layout(location = 0) out float outData0;
    layout(location = 1) out float outData1;
    

    这是可行的。

    1 回复  |  直到 7 年前
        1
  •  0
  •   user3162781    4 年前

    绑定输入,并将输出指向正确的位置。

    layout(binding = 0) uniform sampler2DRect inData0
    layout(binding = 1) uniform sampler2DRect inData1
    layout(location = 0) out float outData0;
    layout(location = 1) out float outData1;