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.
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
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.
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
}
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.