gpt4 book ai didi

c# - 无法让模板缓冲区在 OpenTK 中工作,简单的 2D 四边形

转载 作者:太空宇宙 更新时间:2023-11-03 10:31:26 25 4
gpt4 key购买 nike

我一直在尝试让模板测试在我的 OpenTK 2D 游戏中工作,但没有成功 - 我只想在模板缓冲区中绘制低于 say 1 值的纹理部分。花了很长时间阅读模板及其工作原理,但在 C# 中找不到一个示例。下面的代码是我尝试从以下链接移植代码:

opengl stencil buffer - not quite got it working

这是: http://pastebin.com/vJFumvQz

但我根本没有 mask ,只有一个蓝色矩形内的绿色矩形。我怀疑我需要以某种方式初始化缓冲区?任何帮助将不胜感激。

public class StencilTest : GameWindow
{
int stencilBuffer;

public StencilTest() :
base(1, 1, GraphicsMode.Default, "Stencil test")
{
Width = 1500;
Height = 800;
VSync = VSyncMode.On;
GL.ClearColor(Color4.Red);
ClientSize = new Size(1500, 800);
this.Location = new System.Drawing.Point(100,300);
GL.Viewport(0, 0, Width, Height);


GL.GenRenderbuffers(1, out stencilBuffer);
GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, RenderbufferStorage.Depth24Stencil8, 1500, 800);
GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, stencilBuffer);
}

protected override void OnRenderFrame(FrameEventArgs e)
{
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.StencilBufferBit);

GL.MatrixMode(MatrixMode.Projection);
GL.LoadIdentity();
GL.Ortho(-10, 10, -10, 10, -1, 1);

GL.MatrixMode(MatrixMode.Modelview);
GL.LoadIdentity();

GL.Disable(EnableCap.StencilTest);
GL.StencilMask(0x0);

draw_background();

GL.Enable(EnableCap.StencilTest);
GL.StencilMask(0x1);
GL.StencilFunc(StencilFunction.Always, 0x1, 0x1);
GL.StencilOp(StencilOp.Keep, StencilOp.Keep, StencilOp.Replace);
GL.ColorMask(false, false, false, false);
GL.DepthMask(false);

draw_triangle();

GL.StencilMask(0x1);
GL.StencilFunc(StencilFunction.Notequal, 0x1, 0x1);
GL.StencilOp(StencilOp.Keep, StencilOp.Keep, StencilOp.Keep);
GL.ColorMask(true, true, true, true);
GL.DepthMask(true);

draw_blue_square();

SwapBuffers();
base.OnRenderFrame(e);
}


void draw_background()
{
//big blue square
GL.Color4(Color4.Blue);
GL.Begin(PrimitiveType.Quads);
GL.Vertex3(5, 5, 0);
GL.Vertex3(-5, 5, 0);
GL.Vertex3(-5, -5, 0);
GL.Vertex3(5, -5, 0);
GL.End();
}

void draw_triangle()
{
/* transparent triangle */
GL.Color3(Color.White);
GL.Begin(PrimitiveType.Triangles);
GL.Vertex3(-4, -4, 0);
GL.Vertex3(4, -4, 0);
GL.Vertex3(0, 4, 0);
GL.End();
}

void draw_blue_square()
{
/* blue square */
GL.Color4(Color4.Green);
GL.Begin(PrimitiveType.Quads);
GL.Vertex3(3, 3, 0);
GL.Vertex3(-3, 3, 0);
GL.Vertex3(-3, -3, 0);
GL.Vertex3(3, -3, 0);
GL.End();
}
}

最佳答案

您似乎没有模板缓冲区。这部分代码是尝试获取模板缓冲区:

GL.GenRenderbuffers(1, out stencilBuffer);
GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, RenderbufferStorage.Depth24Stencil8, 1500, 800);
GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, stencilBuffer);

但这不是您在本例中所需要的。这会分配一个模板缓冲区,您可以在渲染到帧缓冲区对象(又名 FBO)时使用它,方法是将其附加为 FBO 的深度模板附件。但是在您的代码中,您正在渲染默认的帧缓冲区,因此上面的内容不会有任何效果。

渲染到默认帧缓冲区时,您通常必须在初始设置期间请求所需的所有缓冲区。我不熟悉 OpenTK,但基于我在 GraphicsContext documentation 中找到的内容,您需要创建一个如下所示的 GraphicsMode 实例:

new GraphicsMode(32, 24, 8, 0)

并在设置上下文时传递它。这指定您需要一个 32 位颜色缓冲区、一个 24 位深度缓冲区和一个 8 位模板缓冲区。我怀疑这应该替换您在代码中使用的 GraphicsMode.Default

关于c# - 无法让模板缓冲区在 OpenTK 中工作,简单的 2D 四边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30018878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com