我想从着色器中获得两个输出,然后将它们反馈到着色器中,用作迭代器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;
这是可行的。