2012-12-23 55 views
1

我有一张黑色的形状由透明度包围。我已经用GLKit成功加载了这个纹理,我可以使用GLKBaseEffect将这些形状绘制成矩形。有没有办法改变黑色(即非透明)像素的颜色,所以我可以绘制黄色形状或蓝色形状等?或者我需要一个自定义着色器来做到这一点?使用GLKBaseEffect可以着色纹理

回答

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; 

凡任何前缀ü是传递到着色器的统一变量。

+0

我投入了着色器。 – ahwulf

+0

您不会后悔,GPU编程中的固定功能流水线正迅速成为过去(使用ES 1.1或GLKBaseEffect)。 –

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实验,太,它融合了您的彩色几何形状的顶部质地(当应用贴花时),所以纹理的透明部分显示下面的几何图形。

相关问题