OpenGL:多重采样纹理y轴倒置?

时间:2014-08-16 20:39:26

标签: opengl textures multisampling

我遇到了多重采样纹理的问题。看起来在将它渲染到另一个表面进行渲染之后,它会颠倒翻转。可能导致什么?我应该提供一些代码吗?

编辑:嗯,这将是很多代码,但我们走了。这就是我创建表面/纹理的方法:

protected override void Create(int width, int height, SurfaceFormat format)
    {
        this.format = format;
        bool multisample = format.Multisampling > 0;

        int samples = Math.Max(0, Math.Min(format.Multisampling, 4));
        format.TextureTarget = multisample ? TextureTarget.Texture2DMultisample : format.TextureTarget;
        format.MipMapping = format.MipMapping && format.TextureTarget == TextureTarget.Texture2D;
        Width = width;
        Height = height;
        textureHandle = GL.GenTexture();
        //bind texture

        GL.BindTexture(format.TextureTarget, textureHandle);
        Log.Error("Bound Texture: " + GL.GetError());
        if (format.TextureTarget == TextureTarget.Texture2D)
        {
            GL.TexParameter(format.TextureTarget, TextureParameterName.TextureMinFilter, (int)(format.MipMapping ? TextureMinFilter.LinearMipmapLinear : TextureMinFilter.Linear));
            GL.TexParameter(format.TextureTarget, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
            GL.TexParameter(format.TextureTarget, TextureParameterName.TextureWrapS, (int)format.WrapMode);
            GL.TexParameter(format.TextureTarget, TextureParameterName.TextureWrapT, (int)format.WrapMode);
        }

        Log.Debug("Created Texture Parameters: " + GL.GetError());
        if (samples < 1)
            GL.TexImage2D(format.TextureTarget, 0, format.InternalFormat, Width, Height, 0, format.PixelFormat, format.SourceType, format.Pixels);
        else
            GL.TexImage2DMultisample(TextureTargetMultisample.Texture2DMultisample, samples, format.InternalFormat, Width, Height, true);
        if (format.MipMapping)
            GL.GenerateMipmap(GenerateMipmapTarget.Texture2D);

        Log.Debug("Created Image: " + GL.GetError());
        //unbind texture
        GL.BindTexture(format.TextureTarget, 0);
        //create depthbuffer
        if (format.DepthBuffer)
        {
            GL.GenRenderbuffers(1, out dbHandle);
            GL.BindRenderbuffer(RenderbufferTarget.RenderbufferExt, dbHandle);

            if(multisample)
                GL.RenderbufferStorageMultisample(RenderbufferTarget.RenderbufferExt, samples, RenderbufferStorage.DepthComponent24, Width, Height);
            else
                GL.RenderbufferStorage(RenderbufferTarget.RenderbufferExt, RenderbufferStorage.DepthComponent24, Width, Height);
        }

        //create fbo
        fboHandle = GL.GenFramebuffer();
        GL.BindFramebuffer(FramebufferTarget.FramebufferExt, fboHandle);
        GL.FramebufferTexture2D(FramebufferTarget.FramebufferExt, FramebufferAttachment.ColorAttachment0Ext, format.TextureTarget, textureHandle, 0);

        if (format.DepthBuffer)
            GL.FramebufferRenderbuffer(FramebufferTarget.FramebufferExt, FramebufferAttachment.DepthAttachmentExt, RenderbufferTarget.RenderbufferExt, dbHandle);
        Log.Debug("Framebuffer status: " + GL.CheckFramebufferStatus(FramebufferTarget.FramebufferExt));
        Log.Debug("Created Framebuffer: " + GL.GetError());
        GL.BindFramebuffer(FramebufferTarget.FramebufferExt, 0);

    } 

创建:

var sf = SurfaceFormat.Surface2D;
sf.Multisampling = 4;
multisampler = new Surface(Window.Width, Window.Height, sf);

现在在渲染循环中,我执行以下操作:

        //Render entire scene to multisampler
        SceneRenderer.RenderMultisampled(ActiveCamera, multisampler, time);
        //blit sampler to my material input texture
        multisampler.CloneTo(postEffect.Textures["_tex"]);
        //blit this texture to my "Canvas" (basically a surface with additional drawing methods. The canvas material is use as a texture for a quad in my scene, thus rendering a copy of the output image to a plane.
        postEffect.Textures["_tex"].CloneTo(canvas.Surface);
        //This would be the same but via rendering with a quad instead of blitting. Has the same result
        //canvas.Clear();
        //canvas.DrawMaterial(postEffect);


        //clear framebuffer
        GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0);
        //Set viewport
        GL.Viewport(0, 0, Window.Width, Window.Height);
        //use material (bind shader & shader params) and draw the scene.
        postEffect.Use();
        Helper.DrawScreenQuad();
        GL.UseProgram(0);

如果这还不够,我还可以发布着色器&amp;网格代码。

EDIT2:好的,现在一切都按预期工作除了我使用canvas.draw()而不是blitting纹理。 draw方法如下所示:

    public void DrawMaterial(Material material)
    {
        GL.Viewport(0, 0, Surface.Width, Surface.Height);

        Surface.BindFramebuffer();
        material.Use();
        Helper.DrawScreenQuad();
        GL.UseProgram(0);
        GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0);
    }

画四幕:

    public static void DrawScreenQuad()
    {
        GL.Begin(PrimitiveType.Quads);

        GL.TexCoord2(0, 1);
        GL.Vertex2(-1, -1);

        GL.TexCoord2(1, 1);
        GL.Vertex2(1, -1);

        GL.TexCoord2(1, 0);
        GL.Vertex2(1, 1);

        GL.TexCoord2(0, 0);
        GL.Vertex2(-1, 1);

        GL.End();
    }

Shader使用:

[Shader vertex]
#version 150 core

in vec2 _pos;
out vec2 texCoord;
uniform float _time;
uniform sampler2D tex;

void main() {
    gl_Position = vec4(_pos, 0, 1);
    texCoord = _pos/2+vec2(0.5,0.5);
    texCoord.y = 1 - texCoord.y;
}


[Shader fragment]
#version 150 core
#define PI 3.1415926535897932384626433832795

out vec4 outColor;
uniform float _time;
uniform sampler2D tex;
in vec2 texCoord;
//
void main() {
    outColor = texture2D(tex, texCoord);
}

不知何故,渲染的场景被颠倒了。为什么?

1 个答案:

答案 0 :(得分:0)

我想我发现了自己的错误。我有纹理坐标和相机倒置。现在似乎已经修好了。为什么我仍然没有理解,为什么这样做:

[Shader vertex]
#version 150 core

in vec2 _pos;
out vec2 texCoord;
uniform float _time;
uniform sampler2D tex;

void main() {
    gl_Position = vec4(_pos, 0, 1);
    texCoord = _pos/2+vec2(0.5,0.5);
    //texCoord.y = 1 - texCoord.y;
}


[Shader fragment]
#version 150 core
#define PI 3.1415926535897932384626433832795

out vec4 outColor;
uniform float _time;
uniform sampler2D tex;
in vec2 texCoord;
//
void main() {
    outColor = texture2D(tex, texCoord);
}

我希望tex坐标的y坐标需要反转。