使用GLKit更改纹理上的alpha / opacity通道

时间:2014-01-12 03:02:10

标签: opengl-es-2.0 glkit

我是opengl es的新手,我似乎无法弄清楚你将如何改变alpha / opacity 在装有GLKTextureLoader的纹理上。

现在我只使用以下代码绘制纹理。

self.texture.effect.texture2d0.enabled = YES;
self.texture.effect.texture2d0.name = self.texture.textureInfo.name;
self.texture.effect.transform.modelviewMatrix = [self modelMatrix];
[self.texture.effect prepareToDraw];
glEnableVertexAttribArray(GLKVertexAttribPosition);
glEnableVertexAttribArray(GLKVertexAttribTexCoord0);

NKTexturedQuad _quad = self.texture.quad;
long offset = (long)&_quad;
glVertexAttribPointer(GLKVertexAttribPosition,
                      2,
                      GL_FLOAT,
                      GL_FALSE,
                      sizeof(NKTexturedVertex),
                      (void *)(offset + offsetof(NKTexturedVertex, geometryVertex)));

glVertexAttribPointer(GLKVertexAttribTexCoord0,
                      2,
                      GL_FLOAT, GL_FALSE,
                      sizeof(NKTexturedVertex),
                      (void *)(offset + offsetof(NKTexturedVertex, textureVertex)));

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

任何建议都会非常有用:)

2 个答案:

答案 0 :(得分:3)

我不是专家,但是用改变的alpha值绘制似乎不像rickster所描述的那样工作。

据我所知,传递给glBlendColor的值仅在使用glBlendFunc常量时使用:GL_CONSTANT_ ...

这将覆盖纹理alpha值并使用定义的值绘制:

glEnable(GL_BLEND);
glBlendFunc(GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA);
glBlendColor(1.0, 1.0, 1.0, yourAlphaValue);
glDraw... // the draw operations

可在此处找到进一步的参考资料http://www.opengl.org/wiki/Blending#Blend_Color

答案 1 :(得分:-1)

只要您处于OpenGL ES 1.1世界(或GLKBaseEffect的模拟-1.1世界),alpha就是纹理中的(每像素)位图数据或属性的属性。 (完成)您正在绘制的OpenGL ES状态。您无法单独为整个纹理设置不透明度级别。所以,你有三个选择:

  1. 更改纹理的alpha。这意味着更改纹理位图数据本身 - 使用您选择的2D图像上下文以半(或任何)alpha的形式绘制图像,并将生成的图像读取到OpenGL ES纹理中。可能不是一个好主意,除非你想要的alpha将在你的应用程序的生命周期中保持不变。在这种情况下,你可以回到Photoshop(或者你用来创建图像资源的任何东西)并在那里设置alpha。

  2. 更改您正在绘制的Alpha。在prepareToDraw之后,在GL中设置混合:

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA);
    glBlendColor(1.0, 1.0, 1.0, myDesiredAlphaValue);
    glDraw... // whatever you're drawing
    

    不要忘记A)在您想要混合的任何内容之后绘制部分透明的内容,并且B)在下一帧再次渲染不透明内容之前禁用混合。

  3. 抛弃GLKBaseEffect并编写自己的着色器。像1.1固定功能管道一样工作的着色器只需要十几个 - 您甚至可以通过使用Xcode“OpenGL Game”项目模板打包的着色器或查看GLKit在Xcode帧捕获工具中编写的着色器来开始。一旦有了这样的着色器,更改从纹素查找中获得的颜色的alpha就是一个简单的操作:

    vec4 color = texture2D(texUnit, texCoord);
    color.a = myDesiredAlphaValue;
    gl_FragColor = color;