【问题标题】:Using GLKBaseEffect is it possible to colorize a texture使用 GLKBaseEffect 可以为纹理着色
【发布时间】:2012-12-23 03:56:50
【问题描述】:

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

【问题讨论】:

    标签: ios6 opengl-es-2.0 glkit


    【解决方案1】:

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

    您可以在指向 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 为前缀的任何东西都是传入着色器的统一变量。

    【讨论】:

    • 我放弃了使用着色器。
    • 您不会后悔的,GPU 编程中的固定功能管道正在迅速成为过去(使用 ES 1.1 或 GLKBaseEffect)。
    【解决方案2】:

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

        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,它将您的纹理混合到彩色几何体之上(如应用贴花时),因此纹理的透明部分显示下方的几何体.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-17
      • 2019-01-12
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      相关资源
      最近更新 更多