Articles of 模板

仅在像素不透明的情况下使用图像作为蒙版

我们正在制作我们的瓷砖地图的游戏,我们用蒙版在图像上雕刻(首先,整个地图是一个图像,我们用瓷砖在上面创建洞来创建地图并进行背景展示。比如在任何普通的基于平铺的游戏中减去而不是添加新的瓷砖)。 我们已经完成了这个只是一个使用模板缓冲区作为掩码的瓷砖。 问题出现在我们想用所有像素都不透明的瓦片进行遮罩,例如斜坡。 问题是,它应用了遮罩,就好像在不透明的瓦片中的所有像素一样,我们想以两种不同的方式应用遮罩: 1)保持掩模像素不透明的大图像的像素 2)掩盖大图像的像素,其中掩模像素是透明的(alpha == 0) 我已经阅读了大量有关使用模板和alpha混合的信息,但无法使其工作。 检查stream水线顺序,似乎在计算碎片颜色之后应用模板。 是否有可能访问模板阶段的alpha值,并根据需要写入模板,以掩盖图像的一部分(在我的情况瓷砖)。 更新来添加一个可视化的例子:

什么是使用OpenGL绘制对象轮廓的最佳方式

我想select像对象一样绘制三维人体轮廓的最佳方法,以及为这种对象绘制轮廓的最佳方法是什么。 我发现基于模板缓冲区的方法,基于几何着色器的方法和基于香椿着色器的方法是一个,如果这是好的,如果是这样的方法。 还是有其他的最好的方法来画一个轮廓。

在XNA中用模板裁剪多边形(不使用spritebatch)

问题…我正在绘制多边形,在这种情况下框,我想剪辑与其父母的客户区的儿童多边形。 // Class Region public void Render(GraphicsDevice Device, Camera Camera) { int StencilLevel = 0; Device.Clear( ClearOptions.Stencil, Vector4.Zero, 0, StencilLevel ); Render( Device, Camera, StencilLevel ); } private void Render(GraphicsDevice Device, Camera Camera, int StencilLevel) { Device.SamplerStates[0] = this.SamplerState; Device.Textures[0] = this.Texture; Device.RasterizerState = RasterizerState.CullNone; Device.BlendState = BlendState.AlphaBlend; Device.DepthStencilState = DepthStencilState.Default; Effect.Prepare(this, Camera ); Device.DepthStencilState […]

使用模具重新创造一个难题效果

我试图重新创建一些我在reddit上看到的东西。 我试图将相机输出渲染到飞机上,但没有得到我想要的结果 – 这基本上是我试图重新创建的: 我在GitHub上find了这个项目, 这个项目是相似的,但是根据视图渲染静态对象(这是我想要做的事情吗?)。 这是我到目前为止: 具有面向内的平面的立方体,里面有一个球体: 面向每个内壁的正射相机: 具有外向飞机的立方体: 每个立方体的脸上都有一个材质: 有一个纹理反映了相机的一个视口: 我确定我需要做一些着色器模板工作 – 而且我没有太多的经验。 任何帮助是极大的赞赏!

模板缓冲区似乎不正确递减值

我正在尝试使用模板缓冲区作为我的UI系统的剪辑器,但是在debugging我正在运行的问题时遇到了问题。 这就是我正在做的:一个小部件可以传递一个矩形到模具裁剪function,这将增加它覆盖的模板缓冲值。 然后它将画出它的孩子,只有在模板区域才能画出来(如果他们延伸到外面,他们将被剪裁)。 在一个小部件完成绘制它的子项之后,它会从堆栈中popup该矩形,并在此过程中递减之前递增的模板缓冲区中的值。 稍微简化的代码如下: static void drawStencil(Rect& rect, unsigned int ref) { // Save previous values of the color and depth masks GLboolean colorMask[4]; GLboolean depthMask; glGetBooleanv(GL_COLOR_WRITEMASK, colorMask); glGetBooleanv(GL_DEPTH_WRITEMASK, &depthMask); // Turn off drawing glColorMask(0, 0, 0, 0); glDepthMask(0); // Draw vertices here … // Turn everything back on glColorMask(colorMask[0], colorMask[1], colorMask[2], colorMask[3]); glDepthMask(depthMask); […]

如何结合深度和模板testing?

我有一个连续的高度映射网格来表示风景。 我使用模板testing在网格中创建孔。 我向模板缓冲区绘制孔,然后用它来丢弃网格碎片。 一切工作正常,只是我的洞是通过网格可见,即使他们被更高的地面堵塞。 有没有办法将深度testing应用到一个孔,保持我的网格绘制在一个单一的调用glDrawElements?

glScissor会影响模板和深度缓冲操作吗?

我知道glScissor()会影响glColorMask()和glDepthMask() ,但会影响模板和深度缓冲区吗? 例如: glEnable(GL_DEPTH_TEST); glEnable(GL_SCISSOR_TEST); glEnable(GL_STENCIL_TEST); glScissor(X,Y,W,H); // Is this color mask set only for the scissor area? glColorMask(TRUE,TRUE,TRUE,TRUE); // Does this stencil function only work within the scissor area? glstencilfunc(GL_ALWAYS); // Does the stencil function only work within scissor area? glstencilop(GL_KEEP,GL_KEEP,GL_KEEP); // Is this depth mask set only for the scissor area? glDepthMask(GL_TRUE); // […]

Stencil Buffer在OpenGL ES 2.0(Android)中无法正常工作

我正试图去处理模板缓冲区。 除了设置视口,相机等,我的OpenGL ES 2.0初始化代码是: GLES20.glDisable(GLES20.GL_CULL_FACE); GLES20.glDisable(GLES20.GL_DEPTH_TEST); GLES20.glEnable(GLES20.GL_BLEND); GLES20.glEnable(GLES20.GL_STENCIL_TEST); GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA); GLES20.glClearColor(0.2f, 0.8f, 1.0f, 0); GLES20.glClearStencil(0); 我的主要代码如下。 GLES20.glEnable(GLES20.GL_STENCIL_TEST); GLES20.glColorMask(false, false, false, false); GLES20.glStencilFunc(GLES20.GL_NEVER, 1, 0xFF); GLES20.glStencilOp(GLES20.GL_REPLACE, GLES20.GL_KEEP, GLES20.GL_KEEP); GLES20.glStencilMask(0xFF); GLES20.glClear(GLES20.GL_STENCIL_BUFFER_BIT); // draw sprites player.draw(); GLES20.glColorMask(true, true, true, true); GLES20.glDepthMask(true); GLES20.glStencilMask(0x00); // don't effect the stencil buffer GLES20.glStencilFunc(GLES20.GL_EQUAL, 0, 0xFF); // draw where stencils value is 0 […]

模板缓冲区和glFrontFace如何帮助建立阴影?

我想了解讷河网站的教程27 。 这是关于如何在OpenGL中使用模板缓冲区来投射对象的阴影。 这里的想法是用光的方向检查物体的所有面的方向,结果将确定这个面是否产生阴影。 在制作阴影的情况下,我们将在模板缓冲区中绘制“阴影”,如下面的代码。 // First Pass. Increase Stencil Value In The Shadow glFrontFace( GL_CCW ); glStencilOp( GL_KEEP, GL_KEEP, GL_INCR ); doShadowPass( object, lightPosition ); // Second Pass. Decrease Stencil Value In The Shadow glFrontFace( GL_CW ); glStencilOp( GL_KEEP, GL_KEEP, GL_DECR ); doShadowPass( object, lightPosition ); 我的问题是为什么在第二遍“glFrontFace”函数帮助删除场景中的对象之间的阴影? 我希望看到你的答案。 非常感谢! P / S:这是教程中的解释,但我不明白 “你可以看到它们被渲染成两遍,一个是用正面递增模板缓冲区(投射阴影),第二个递减模板缓冲区的背面(”closures“对象和任何其他表面之间的阴影)“。

校正模板reflection中的照明

我只是玩OpenGL,看看不同的方法,使阴影和reflection工作。 我一直在关注这个教程 , 该教程描述了如何使用GLUT_STENCIL和MASK来创建对reflection的合理解释。 接下来,稍微调整一下工作,我已经拿出了下面的代码。 不幸的是,创建reflection时照明不正确。 glPushMatrix(); plane(); //draw plane that reflection appears on glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); glDepthMask(GL_FALSE); glEnable(GL_STENCIL_TEST); glStencilFunc(GL_ALWAYS, 1, 0xFFFFFFFF); glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); plane(); //draw plane that acts as clipping area for reflection glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glDepthMask(GL_TRUE); glStencilFunc(GL_EQUAL, 1, 0xFFFFFFFF); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glDisable(GL_DEPTH_TEST); glPushMatrix(); glScalef(1.0f, -1.0f, 1.0f); glTranslatef(0,2,0); glRotatef(180,0,1,0); sphere(radius, […]