2017-02-12 92 views
0

我想在OpenGL中渲染模型。我在C++和OpenGL的第4天(是的,我已经很快学会了这一点),并且我在纹理方面略有停顿。如何让我的对象透明但仍然显示纹理?

我在制作纹理alpha工作时遇到了一些麻烦。在这张图片中,我有来自螺旋骑士的这个角色。正如你可以在头顶看到的那样,有那些白色的部分。 Spiral Knights character with no transparency

我有混合方法启用,什么我假设我在这里的混合功能设置为glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

,这就是为什么我问这个问题,是质地透明工作,但纹理背后的三角形仍在显示。

如何让这些三角形看不见但仍能显示我的纹理?

谢谢。

+1

Threre没有“纹理背后的三角形”。 GL不绘制纹理,它绘制原始图形。完全不清楚究竟发生了什么(你的纹理有哪些akoha值,你如何将纹理结合到最终的片段颜色等等)。 YOu也应该知道,混合将需要以正确的顺序绘制原语。在这种特殊情况下,你甚至可以通过不使用混合来解决这个问题,而只是通过基于alpha的丢弃来解决这个问题。 – derhass

+0

你说_“只是通过基于alpha的丢弃。”_ - 我做了一些关于丢弃的研究,但是从我读过的内容可能会有点缓慢。有没有其他方法?我做了一些搜索替代方法并启用alpha测试,然后将alpha函数设置为'glAlphaFunc(GL_GREATER,0.0);'但似乎没有工作。 –

+0

alpha测试已弃用。现代的方法在着色器中被丢弃。在这种情况下“慢”的真正含义很难预先说明。你可能会后退到深度测试,并且你会得到一定程度的非均匀控制流。但是,您获得订单独立性作为回报。 – derhass

回答

0

有使用混合时要完成两个重要的事情:

  1. 必须排序元后到前和渲染基于深度缓冲呈示顺序(顺序无关的透明度仍然是一个持续的研究课题)。

  2. 当使用纹理来控制alpha通道时,您必须写一个着色器,以某种方式获取纹理的alpha值传递给结果片段颜色,或者 - 如果您使用的是固定功能管道,则必须使用GL_MODULATE纹理env模式或GL_DECAL(原始颜色alpha值设置为0),或使用GL_REPLACE。

+0

至于任务#2的第二部分,我知道'glTexEnvi'需要3个参数。在阅读[本页](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glTexEnv.xml)后,我继续尝试根据该页面的信息做你说的话。我将我的内部格式设置为GL_RGBA(在'glTexImage2D'函数中),我使用'glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);',但这似乎不起作用。我错过了什么吗? –

+0

@XantheDragon:很难说没有看到你的代码。 – datenwolf