概述
我正在尝试通过组合一些图像和渐变在我的游戏中构建图形。我开始使用 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(...) 可能包含我的答案。但我不明白不同的模式。我在正确的轨道上吗?
编辑:仍然没有解决方案,但我已经更新了我在问题中的假设。