2012-11-07 86 views
1

我的项目是一个使用OpenGL 2.0和GLKit的IOS应用程序。 简而言之,我有一个透明背景的明星纹理,我想应用在广场上。期望的最终结果是看到一颗星星;不是广场上的明星。OpenGL- GLKit:透明对象和纹理

我当前的问题是,当我在正方形上应用纹理时,我看到一个由其材质颜色变量定义的彩色正方形的星。我希望看到的只有明星,并让方形的其余部分透明。

的代码如下:

glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 


    [effectTmp prepareToDraw]; 

    glEnableVertexAttribArray(GLKVertexAttribPosition); 
    glEnableVertexAttribArray(GLKVertexAttribTexCoord0); 
    glEnableVertexAttribArray(GLKVertexAttribNormal); 

    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(ColoredVertexData3D), &vertexDataTexture[0].vertex); 
    glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, sizeof(ColoredVertexData3D), &vertexDataTexture[0].normal); 

    glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(ColoredVertexData3D), &vertexDataTexture[0].color); 

    glDrawArrays(GL_TRIANGLES, 0, [drawObjectTmp getSizeFromVertexIndicesArray]); 
    glDisableVertexAttribArray(GLKVertexAttribPosition); 
    glDisableVertexAttribArray(GLKVertexAttribTexCoord0); 
    glDisableVertexAttribArray(GLKVertexAttribNormal); 

    glDisable(GL_BLEND); 

而envMode设为GLKTextureEnvModeDecal如下:

effect.texture2d0.envMode = GLKTextureEnvModeDecal;

也许在走廊里有一头大象我没有看到;并欢迎任何帮助或指针,以帮助看到它的透明正方形的明星。

干杯, 斯特凡

回答

3

docs - GLKTextureEnvModeDecal使用纹理的阿尔法分量与输入颜色混合纹理的颜色。

我想你想要GLKTextureEnvModeReplace。

+0

你好,是的,你是绝对正确的; envModeDecal就是其中之一。我误以为它对纹理显示有影响。这个错误比我想象的要多一点:基本上我的应用程序通过OBJ导入搅拌机模型。背景模型在使用alpha的模型之后被处理;导致alpha模型中的黑色纹理,因为背景尚未计算。更改Blender中创建的顺序的方法是:) – stephane

+0

*注意*:Decal允许底层几何体通过纹理的透明部分显示,其中'GL_MODULATE'将纹理颜色与底层像素相乘,因此透明部分纹理变成透明几何体。不管几何看起来如何,GLKTextureEnvModeReplace只是踩踏纹理的像素。 – Olie