Ios6 使用GLKBaseEffect可以为纹理着色

Ios6 使用GLKBaseEffect可以为纹理着色,ios6,opengl-es-2.0,glkit,Ios6,Opengl Es 2.0,Glkit,我有一张黑色的形状,周围是透明的。我已经成功地用GLKit加载了这个纹理,我可以使用GLKBaseEffect将形状绘制成矩形。有没有办法改变黑色即不透明像素的颜色,这样我就可以画黄色或蓝色的形状等?或者我需要一个自定义着色器来执行此操作吗?似乎您需要一个自定义着色器,我强烈建议您使用该着色器,因为您需要检查各个texel颜色值,但以下是一些建议,请先尝试: 可以在指向GlkVertexAttributeColor的顶点属性数组中按顶点数据传递颜色。这将允许您单独设置每个顶点的颜色,并最终设置面

我有一张黑色的形状,周围是透明的。我已经成功地用GLKit加载了这个纹理,我可以使用GLKBaseEffect将形状绘制成矩形。有没有办法改变黑色即不透明像素的颜色,这样我就可以画黄色或蓝色的形状等?或者我需要一个自定义着色器来执行此操作吗?

似乎您需要一个自定义着色器,我强烈建议您使用该着色器,因为您需要检查各个texel颜色值,但以下是一些建议,请先尝试:

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

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

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的任何对象都是传递到着色器中的统一变量。

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

    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;

注意:您也可以尝试使用GLKTextureEnvModeLabel,它将您的纹理混合在彩色几何体的顶部,就像在应用贴花时一样,因此纹理的透明部分显示下面的几何体。

我已放弃使用着色器。您不会后悔的,使用ES 1.1或GLKBaseEffect,GPU编程中的固定函数管道正在迅速成为过去。