Laden...

OpenGL: Portale Erzeugen

Erstellt von userid11997 vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.426 Views
U
userid11997 Themenstarter:in
400 Beiträge seit 2008
vor 13 Jahren
OpenGL: Portale Erzeugen

Moin,

wie kann ich in OpenGL ein oder mehrere Portale erzeugen?
Ich habe bereits mit dem Stencilbuffer gearbeitet , um Reflektionen zu erzeugen , weiß aber nicht , wie ich das eventuell einsetzen kann , um den Kontext aus eienm anderen Blickwinkel zu rendern.

Ich würde gerne Portale wie in Portal erstellen.

Vielen Dank für Hilfe.

1.130 Beiträge seit 2007
vor 13 Jahren

stencilbuffer setzen, wiewmatrix auf gewünscghten blickwinkel ändern und fertig.
je nachdem, was du erreichen willst lässt sich das vielleicht auch einfacher erzeugen, um viewmatrix-rumdoktorn kommste aber nich herum.

außer stencilbuffer gibts noch was anderes:
http://wiki.delphigl.com/index.php/Tutorial_Renderpass

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

U
userid11997 Themenstarter:in
400 Beiträge seit 2008
vor 13 Jahren

Das mit der Textur ist ja einfach (übrigens guter Tipp, danke 😄) , wann aber muss ich das beim StencilBuffer machen?

Wenn ich habe

public override void Prepare()
        {
            LibCore.ColorMask(false, false, false, false);

            LibCore.Enable(EnableCap.StencilTest);
            LibCore.StencilFunc(StencilFunction.Always, 1, 1);
            LibCore.StencilOp(StencilOp.Keep, StencilOp.Keep, StencilOp.Replace);

            LibCore.Disable(EnableCap.DepthTest);
        }

//Mesh rendern , dass reflektieren soll

        public override void CleanUp()
        {
            LibCore.Enable(EnableCap.DepthTest);
            LibCore.Disable(EnableCap.Blend);
            LibCore.ColorMask(true, true, true, true);
            LibCore.StencilFunc(StencilFunction.Equal, 1, 1);
            LibCore.StencilOp(StencilOp.Keep, StencilOp.Keep, StencilOp.Keep);

            LibCore.Enable(EnableCap.ClipPlane0);
            LibCore.ClipPlane(ClipPlaneName.ClipPlane0, new double[] { -exertionVector.X, -exertionVector.Y, -exertionVector.Z, 0.0 });					// Equation For Reflected Objects
            LibCore.PushMatrix();
            LibCore.Scalef(1.0f, -1.0f, 1.0f);

            //meshes rendern , die reflektiert werden sollen
            for (int i = 0; i < exertionObjects.Count; i++)
                if (exertionObjects[i] is Meshes.Mesh)
                    ((Meshes.Mesh)exertionObjects[i]).Render();
                else
                    if (exertionObjects[i] is Sprites.Sprite)
                        ((Sprites.Sprite)exertionObjects[i]).Render();

            LibCore.PopMatrix();
            LibCore.Disable(EnableCap.ClipPlane0);
            LibCore.Disable(EnableCap.StencilTest);
        }

Wenn ich das Mesh render , sind die Eigenschaften über Position und drehung bereits festgelegt.

U
userid11997 Themenstarter:in
400 Beiträge seit 2008
vor 13 Jahren

Bin jetzt auf den Texturrenderingteil umgestiegen und hab jetzt ein Problem , ich habe diesen Code (abgeändert) aus einem Tutorial übernommen.

Nun habe ich aber das Problem , dass meine Textur immer leer ist , also nichts zu sehen ist. Weiß jemand woran das liegen kann?

Wenn ich die Texturparameter nicht setze , sondern direkt von bind auf teximage springe , bekomme ich eine FramebufferUnsupported-Exception. kann das daran liegen?


public Texture CreateTexture()
        {
            LibCore.Enable(EnableCap.Texture2D);

            uint[] texture = new uint[1];

            LibCore.Enable(EnableCap.Texture2D);
            LibCore.GenTexturesa(1, texture);
            LibCore.BindTexture(TextureTarget.Texture2D, texture[0]);
            LibCore.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, size.Width, size.Height, 0, PixelFormat.Rgba, PixelType.UnsignedByte, IntPtr.Zero);
            LibCore.TexParameteri(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureFilter.Linear);
            LibCore.TexParameteri(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureFilter.Linear);

            ErrorCode code = LibCore.GetError();
            if (code != ErrorCode.NoError)
                throw new U3EException.ExtensionException(code.ToString());

            return new Texture(texture);
        }

public void Prepare()
        {
            if (!base.AvilableExtensions.Contains("EXT_framebuffer_object"))
                throw new U3EException.ExtensionException("Diese Extension wird nicht unterstütz");

            ExtensionProvider.GenRenderbuffersEXT(1, renderbuffer);
            ExtensionProvider.GenFramebuffersEXT(1, framebuffer);

            ExtensionProvider.BindFramebufferEXT(FramebufferTarget.FramebufferExt, framebuffer[0]);
            ExtensionProvider.BindRenderbufferEXT(RenderbufferTarget.RenderbufferExt, renderbuffer[0]);

            ExtensionProvider.RenderbufferStorageEXT(RenderbufferTarget.RenderbufferExt, (U3E.OpenGL.RenderbufferStorage)All.DepthComponent, size.Width, size.Height);
            ExtensionProvider.FramebufferRenderbufferEXT(FramebufferTarget.FramebufferExt, FramebufferAttachment.DepthAttachmentExt, RenderbufferTarget.RenderbufferExt, renderbuffer[0]);

            ExtensionProvider.framebufferTexture2DEXT(FramebufferTarget.FramebufferExt, FramebufferAttachment.ColorAttachment0, TextureTarget.Texture2D, texture.Side[0], 0);

            FramebufferErrorCode fbcode = ExtensionProvider.CheckFramebufferStatus(FramebufferTarget.FramebufferExt);
            if (fbcode != FramebufferErrorCode.FramebufferCompleteExt)
                throw new U3EException.ExtensionException(fbcode.ToString());
        }

        public void Generate(Camera view)
        {
            if (!base.AvilableExtensions.Contains("EXT_framebuffer_object"))
                throw new U3EException.ExtensionException("Diese Extension wird nicht unterstütz");

            ExtensionProvider.BindFramebufferEXT(FramebufferTarget.FramebufferExt,framebuffer[0]);

            LibCore.PushAttrib(AttribMask.ViewportBit); // stores GL.Viewport() parameters
            LibCore.Viewport(0, 0, size.Width, size.Height);

            LibCore.ClearColor(1.0f, 0.0f, 0.0f, 0.0f);
            LibCore.Clear(ClearBufferMask.DepthBufferBit | ClearBufferMask.ColorBufferBit);
            LibCore.LoadIdentity();

            ErrorCode code = LibCore.GetError();
            if (code != ErrorCode.NoError)
                throw new U3EException.ExtensionException(code.ToString());

            LibCore.Translatef(0.0f, 0.0f, 2.0f);

            LibCore.Color3f(1.0f, 1.0f, 1.0f);
            LibCore.Color3f(0.0f, 1.0f, 1.0f);

            LibCore.Begin(BeginMode.Quads);
            // Front Face
            LibCore.Vertex3f(-1.0f, -1.0f, 1.0f);	// Bottom Left Of The Texture and Quad
            LibCore.Vertex3f(1.0f, -1.0f, 1.0f);	// Bottom Right Of The Texture and Quad
            LibCore.Vertex3f(1.0f, 1.0f, 1.0f);	// Top Right Of The Texture and Quad
            LibCore.Vertex3f(-1.0f, 1.0f, 1.0f);	// Top Left Of The Texture and Quad
            // Back Face
            LibCore.Vertex3f(-1.0f, -1.0f, -1.0f);	// Bottom Right Of The Texture and Quad
            LibCore.Vertex3f(-1.0f, 1.0f, -1.0f);	// Top Right Of The Texture and Quad
            LibCore.Vertex3f(1.0f, 1.0f, -1.0f);	// Top Left Of The Texture and Quad
            LibCore.Vertex3f(1.0f, -1.0f, -1.0f);	// Bottom Left Of The Texture and Quad
            // Top Face
            LibCore.Vertex3f(-1.0f, 1.0f, -1.0f);	// Top Left Of The Texture and Quad
            LibCore.Vertex3f(-1.0f, 1.0f, 1.0f);	// Bottom Left Of The Texture and Quad
            LibCore.Vertex3f(1.0f, 1.0f, 1.0f);	// Bottom Right Of The Texture and Quad
            LibCore.Vertex3f(1.0f, 1.0f, -1.0f);	// Top Right Of The Texture and Quad
            // Bottom Face
            LibCore.Vertex3f(-1.0f, -1.0f, -1.0f);	// Top Right Of The Texture and Quad
            LibCore.Vertex3f(1.0f, -1.0f, -1.0f);	// Top Left Of The Texture and Quad
            LibCore.Vertex3f(1.0f, -1.0f, 1.0f);	// Bottom Left Of The Texture and Quad
            LibCore.Vertex3f(-1.0f, -1.0f, 1.0f);	// Bottom Right Of The Texture and Quad
            // Right face
            LibCore.Vertex3f(1.0f, -1.0f, -1.0f);	// Bottom Right Of The Texture and Quad
            LibCore.Vertex3f(1.0f, 1.0f, -1.0f);	// Top Right Of The Texture and Quad
            LibCore.Vertex3f(1.0f, 1.0f, 1.0f);	// Top Left Of The Texture and Quad
            LibCore.Vertex3f(1.0f, -1.0f, 1.0f);	// Bottom Left Of The Texture and Quad
            // Left Face
            LibCore.Vertex3f(-1.0f, -1.0f, -1.0f);	// Bottom Left Of The Texture and Quad
            LibCore.Vertex3f(-1.0f, -1.0f, 1.0f);	// Bottom Right Of The Texture and Quad
            LibCore.Vertex3f(-1.0f, 1.0f, 1.0f);	// Top Right Of The Texture and Quad
            LibCore.Vertex3f(-1.0f, 1.0f, -1.0f);	// Top Left Of The Texture and Quad
            LibCore.End();

            code = LibCore.GetError();
            if (code != ErrorCode.NoError)
                throw new U3EException.ExtensionException(code.ToString());

            LibCore.Flush();
            LibCore.SwapBuffers(Device.Devices[0]._hDC);

            LibCore.ClearColor(0.0f, 0.0f, 0.0f, 0.5f);

            LibCore.PopAttrib(); // restores GL.Viewport() parameters
            ExtensionProvider.BindFramebufferEXT(FramebufferTarget.FramebufferExt, 0); // return to visible framebuffer
        }

U
userid11997 Themenstarter:in
400 Beiträge seit 2008
vor 13 Jahren

Kann es sein , dass eine Transformation mit glTranslate nicht funktioniert?
Wenn ich das Mesh an der Position 0,0,0 rendere , zeigt meine Textur die Frabe des Meshes an , sobald ich aber Transformiere , ist das Mesh nicht mehr zu sehen.