使用GLKBaseEffect可以着色纹理

时间:2012-12-23 03:56:51

标签: ios6 opengl-es-2.0 glkit

我有一张被透明物包围的黑色形状。我用GLKit成功加载了这个纹理,我可以使用GLKBaseEffect将形状绘制成矩形。有没有办法改变黑色(即非透明)像素的颜色,所以我可以绘制黄色形状或蓝色形状等?或者我需要自定义着色器才能执行此操作?

2 个答案:

答案 0 :(得分:0)

您似乎需要自定义着色器(我强烈推荐使用),因为您需要检查单个纹理颜色值,但这里有一些建议首先尝试:

您可以在指向 GLKVertexAttribColor 的顶点属性数组中将颜色作为每顶点数据传递。这将允许您单独设置每个顶点(最终是面)的颜色,但很难看到它们与纹理对齐的位置。

您可以尝试在效果上启用以下属性:

effect.colorMaterialEnabled = YES;

但是,对于这两种情况,如果您的纹素是完全黑色的,那么我认为不会显示任何颜色变化。

我认为自定义着色器绝对是可行的方法,因为您需要执行以下操作:

highp vec4 finalColor;
highp vec4 textureColor = texture2D(uTexture, vTexel);
highp vec4 surfaceColor = uColor;

// If texel is non-transparent (check alpha channel)
if(textureColor.a > 0.001)
    finalColor = surfaceColor;
else
    finalColor = vec4(0.0, 0.0, 0.0, 0.0);

gl_FragColor = finalColor;

u 为前缀的任何内容都是传递到着色器的统一变量。

答案 1 :(得分:0)

要获得完全着色的纹理,请使用:

    self.effect.texture2d0.envMode = GLKTextureEnvModeModulate;

告诉OpenGL采用纹理中的任何颜色,并将其乘以底层几何体的任何颜色。然后,您可以使用顶点着色来获得整洁的淡入淡出等等。

注意:您需要将纹理从黑色更改为白色(1,1,1,1),因此乘法工作正常。

注意:以下是您应该具备的其他一些设置:

    self.effect.texture2d0.enabled = GL_TRUE;
    self.effect.texture2d0.target = GLKTextureTarget2D;
    self.effect.texture2d0.name = self.texture.name;        
    self.effect.colorMaterialEnabled = GL_TRUE;

注意:你也可以试验GLKTextureEnvModeDecal,它将纹理混合在彩色几何体的顶部(如应用贴花时),因此纹理的透明部分显示下面的几何形状。