在使用Mac上的OpenGL中的模板测试绘图时遇到问题.当我第一次绘制场景时,模板工作正常.我在中间绘制一个半透明的黑色矩形,启用了对模板缓冲区的写入,然后禁用了写入模板缓冲区的更大的蓝色矩形.当窗口首次弹出时,我得到了正确的结果,如下所示:
但是,当我调整窗口大小,再次调用渲染函数时,我得到的结果如下:
有时奇怪的白色空间跟随中间的矩形,有时候白色在看似随意的排列之间捕捉,但是当你回到那个窗口大小时保持这些安排.我在网上找不到解决方案.这是我的渲染函数,在调整窗口大小时调用它:
glClearColor(0, 0, 0, 1);
glClearStencil(0x00);
glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
// Replace data in the stencil buffer with 1s if it passes the test
// which should be GL_ALWAYS
glStencilFunc(GL_ALWAYS, 1, 0xFF);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
// Allow data to be written to the stencil buffer.
glStencilMask(0xFF);
p->fillSquare(1, 1, 1, 0.3, -0.25, 0.25, 0.25, 0.25, -0.25, -0.25, 0.25, -0.25); // Write a semi transparent black rectangle
glStencilMask(0x00); // Disable writing to the stencil buffer.
glStencilFunc(GL_NOTEQUAL, 1, 0xFF); // Only …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用模板缓冲区ID3D11Texture2D来覆盖另一个纹理上的一个纹理的一部分.我计划通过在模板缓冲区上绘制所需的形状然后复制纹理来完成此操作.请提供一些有关2D纹理示例代码的优秀教程,以学习模板缓冲区的使用.(或其他一些方法)
徘徊,如果有人可以帮助我.我目前正在使用webGL将我的内容渲染到帧缓冲区,以便它可以用作项目其他部分的纹理.这就像一个冠军.但是,我现在需要使用模板缓冲区,同时渲染到帧缓冲区,因为我正在使用它来进行掩码.我似乎无法弄清楚如何创建/附加模板缓冲区以使用我的帧缓冲区?到目前为止这是我的代码:
// next time to create a frame buffer and texture
this.frameBuffer = gl.createFramebuffer();
this.texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, this.texture);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer );
gl.bindFramebuffer(gl.FRAMEBUFFER, this.frameBuffer );
gl.framebufferTexture2D(gl.FRAMEBUFFER,
gl.COLOR_ATTACHMENT0,
gl.TEXTURE_2D,
this.texture,0);
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,如何创建然后使用模板缓冲区以及上面创建的frameBuffer?
谢谢大家!
我在WebGL中使用了模板缓冲区.这在Firefox中运行良好,但在Chrome(以及Internet Explorer)中也失败了.除了模板被忽略之外,应用程序的其余部分继续正常运行而没有错误.

这里Firefox正确创建模板,因此绿色矩形在其中呈现孔.这是一个jsFiddle演示:http://jsfiddle.net/XH9eC/3/
我打开模板模式并关闭颜色模板:
gl.colorMask(gl.FALSE, gl.FALSE, gl.FALSE, gl.FALSE);
gl.stencilFunc(gl.ALWAYS, 1, 0xFF);
gl.stencilOp(gl.REPLACE, gl.REPLACE, gl.REPLACE);
Run Code Online (Sandbox Code Playgroud)
然后我在屏幕中间渲染方块
然后我改变了模板模式并打开颜色:
gl.colorMask(true, true, true, true);
gl.stencilFunc(gl.EQUAL, 0, 0xFF);
gl.stencilOp(gl.ZERO, gl.ZERO, gl.ZERO)
Run Code Online (Sandbox Code Playgroud)
最后我渲染了绿色背景.
如果重要,这是我用来渲染背景和方形模板的代码(我只是使用不同的顶点):
var background = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, background);
gl.vertexAttribPointer(position_location, 2, gl.FLOAT, false, 0, 0);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
0, 0,
800, 600,
0, 600,
0, 0,
800, 0,
800, 600
]), gl.STATIC_DRAW);
Run Code Online (Sandbox Code Playgroud)
我用其他代码遇到了这个问题,还没有解决它.我已经看到了Chrome中使用的模板缓冲区的其他示例.
我是 OpenGL 的初学者,在学习模板化这个功能时一直困扰着我(glStencilMask)。
有人告诉我它可以用来启用或禁用模板,这是怎么回事?
为什么将十六进制值传递给此函数?
为什么 HEX 值 0xff 和 0x00 经常专门传递?
此功能是否阻止绘制到颜色缓冲区和/或模板缓冲区?
你能用简单的术语解释它在做什么吗?
我想discard在我的片段着色器中阻止该片段写入模板缓冲区;我对游戏中的视觉效果有一个想法,如果我可以依赖该行为,那么它可能是可以实现的discard。
我的片段着色器没有做任何非常奇特的事情;它只是对纹理进行采样,如果 alpha 接近 0,则discard否则写入。
void main()
{
vec4 texColor = texture(tex, texCoord);
if(texColor.a < 0.5f)
{
discard;
}
FragColor = texColor;
}
Run Code Online (Sandbox Code Playgroud)
然而,听起来我不能依赖于discard阻止模板缓冲区被写入:
如果模板测试处于活动状态,则丢弃的片段仍会影响模板缓冲区。即使模板或深度测试失败,模板测试也可以修改模板缓冲区。并且由于模板测试发生在深度测试之前,因此深度测试失败不能阻止模板测试更新模板缓冲区。
我确实需要在渲染时激活模板测试。我不能依靠discard阻止写入模板缓冲区吗?
无论我尝试了什么,粒子都会在地球外部呈现而不会触及地球内部,我想要反过来!无论我改变了什么参数(尝试了2个小时),它的任何一个粒子都会在外面变细但在里面没有,或者在外部和内部都是粒子.我对此感到非常头疼,有人可以帮我解决这个问题.我使用1位用于模板缓冲器.GDEbugger显示模板缓冲区工作正常.
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_NEVER, 1, 1);
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
globe->Use();
globe->SetWVP(&WVP, true);
Render(globe.obj");
glDisable(GL_STENCIL_TEST);
glStencilFunc(GL_EQUAL, 1, 1);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
RenderParticlesUsingTransformFeedback();
Run Code Online (Sandbox Code Playgroud) 我正在通过learningwebgl.com阅读,令我困惑的是它绘制了我作为最后一个元素绑定的第一个缓冲区?
red triangle
green square
blue square
Run Code Online (Sandbox Code Playgroud)
我希望只看到蓝色方块,因为其他一切都被透支了,输出似乎是相反的顺序?
我还读过关于模板缓冲区的内容,所以我试图创建一个掩码(红色),然后蓝色方块上应该有一个绿色三角形.
面具工作(http://jsfiddle.net/D3QNg/3/),但我不知道它是否正确或我是否幸运.
会感激一些帮助.
opengl ×5
webgl ×3
c++ ×2
javascript ×2
buffer ×1
direct3d ×1
firefox ×1
framebuffer ×1
glew ×1
glfw ×1
metal ×1
metalkit ×1
objective-c ×1
opengl-4 ×1
textures ×1