0

概述

我正在尝试通过组合一些图像和渐变在我的游戏中构建图形。我开始使用 Core Graphics,它工作得非常好,但速度非常慢。我现在尝试使用 GLKit 将其移植到 OpenGL,我非常接近,但还有最后一个问题:

我已经在屏幕上将纹理绘制成三角形。现在,在它的顶部,我想画一个渐变。要绘制渐变,我认为最简单的方法是在其中两个顶点绘制黑色,在第三个顶点绘制完全透明(alpha=0)颜色的三角形。渐变本身渲染得很好,但是当它渲染到纹理的顶部时,它看起来好像纹理的 alpha 也受到影响,并导致背景显示出来。

我想要的是:

在此处输入图像描述

我得到的是:

在此处输入图像描述

我承认我对 OpenGL 或 GLKit 不太熟悉。我怀疑三角形上每个点的纹理 alpha 是(1 - 渐变 alpha),这可以解释为什么纹理在角落是完全不透明的,以及为什么纹理和渐变似乎在中间都有部分透明度。

我可以用 GLKit 完成我想要的吗?它甚至与 GLKit 和 GLKBaseEffect 相关,还是我只是在 OpenGL 中做一些我可以关闭的时髦的多纹理操作?

代码片段

我的精灵类中的渲染函数,用于绘制纹理:

typedef struct {
    CGPoint geometryVertex;
    CGPoint textureVertex;
} TexturedVertex;

- (void)renderTriangleStrip:(TexturedVertex *)coordinates ofSize:(NSInteger)size {
    self.effect.texture2d0.envMode = GLKTextureEnvModeReplace;
    self.effect.texture2d0.name = self.textureInfo.name;
    self.effect.texture2d0.enabled = YES;

    self.effect.transform.modelviewMatrix = self.transform;

    [self.effect prepareToDraw];

    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glEnableVertexAttribArray(GLKVertexAttribTexCoord0);

    long offset = (long)coordinates;        
    glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, sizeof(TexturedVertex), (void *) (offset + offsetof(TexturedVertex, geometryVertex)));
    glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(TexturedVertex), (void *) (offset + offsetof(TexturedVertex, textureVertex)));

    glDrawArrays(GL_TRIANGLE_STRIP, 0, size);

    glDisableVertexAttribArray(GLKVertexAttribPosition);
    glDisableVertexAttribArray(GLKVertexAttribTexCoord0);
}

在我的形状类中渲染函数,用于绘制带渐变的三角形:

typedef struct {
    CGPoint position;
    GLKVector4 color;
} ColoredVertex;

- (void)renderVertices:(ColoredVertex *)vertices ofSize:(NSInteger)size {
    self.effect.texture2d0.envMode = GLKTextureEnvModeDecal;
    self.effect.texture2d0.enabled = NO;

    self.effect.useConstantColor = NO;

    self.effect.transform.modelviewMatrix = self.transform;

    [self.effect prepareToDraw];

    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glEnableVertexAttribArray(GLKVertexAttribColor);

    long offset = (long)vertices;
    glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, sizeof(ColoredVertex), (void *) (offset + offsetof(ColoredVertex, position)));
    glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, sizeof(ColoredVertex), (void *) (offset + offsetof(ColoredVertex, color)));

    glDrawArrays(GL_TRIANGLE_FAN, 0, size);

    glDisableVertexAttribArray(GLKVertexAttribPosition);
    glDisableVertexAttribArray(GLKVertexAttribColor);
}

在此先感谢您的帮助!

编辑:看起来 glBlendFunc(...) 可能包含我的答案。但我不明白不同的模式。我在正确的轨道上吗?

编辑:仍然没有解决方案,但我已经更新了我在问题中的假设。

4

1 回答 1

1

我不确定是否理解你的问题,所以我会在我得到它时尝试重述它。

  1. 你画你的棋子背景
  2. 您使用嘈杂的纹理绘制不透明的三角形纹理
  3. 您绘制一个带有颜色渐变的三角形,您想要影响它下面的颜色。

我知道是通过 3 导致您出现问题。

如果是这样,您需要做的是使用适当的混合模式和适当的顶点颜色绘制渐变三角形来获取参考图像。在你的情况下,两种黑色和一种白色。

对于您的情况,将使用以下方式设置混合:

glEnable(GL_BLEND);
glBlendFunc(GL_ZERO, GL_SRC_COLOR);

这将指示 OpenGL 为您绘制三角形,以便生成的像素颜色由 给出dst = 0 * src + src * dst,即dst = dst * src

于 2012-06-16T22:11:55.943 回答