我已经阅读过有关类似问题的其他帖子,似乎已经尝试过那些站在那里的所有内容,但仍然无法达到预期的效果。
我想要的是在屏幕上显示箭头,以便用户通过按下它们来旋转所选对象。我的想法是创建一些具有透明背景的png文件,并将它们显示为纹理。
相应的代码分布在几个源文件中,但我认为相关部分如下:
typedef struct {
unsigned int width;
unsigned int height;
void *image;
} TextureData;
NSString *path = [[NSBundle mainBundle] pathForResource:arrowFile ofType:@"png"];
UIImage *image = [[UIImage alloc] initWithContentsOfFile:path];
TextureData *texData;
texData->width = CGImageGetWidth(image.CGImage);
texData->height = CGImageGetHeight(image.CGImage);
texData->image = malloc(4*texData->height*texData->width);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(texData->image, texData->width,
texData->height, 8, 4*texData->width,colorSpace,
kCGImageAlphaPremultipliedLast|kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);
CGContextClearRect(context, CGRectMake(0, 0, texData->width, texData->height));
CGContextTranslateCTM(context, 0, texData->height - texData->height);
CGContextDrawImage(context, CGRectMake(0, 0, texData->width, texData->height),
image.CGImage);
CGContextRelease(context);
[image release];
使用获得的TextureData结构生成纹理
glBindTexture(GL_TEXTURE_2D, arrowTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texData->width, texData->height,
0, GL_RGBA, GL_UNSIGNED_BYTE, texData->image);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
在渲染阶段,我按如下方式进行:
vec2 texVertices[6];
vec3 vertices[6];
texVertices[0] = vec2(1.0f, -1.0f);
texVertices[1] = vec2(0.0f, -1.0f);
texVertices[2] = vec2(0.0f, 0.0f);
texVertices[3] = vec2(1.0f, -1.0f);
texVertices[4] = vec2(0.0f, 0.0f);
texVertices[5] = vec2(1.0f, 0.0f);
vertices[0] = vec3( 0.5f, 0.5f, 0.0f);
vertices[1] = vec3(-0.5f, 0.5f, 0.0f);
vertices[2] = vec3(-0.5f, -0.5f, 0.0f);
vertices[3] = vec3( 0.5f, 0.5f, 0.0f);
vertices[4] = vec3(-0.5f, -0.5f, 0.0f);
vertices[5] = vec3( 0.5f, -0.5f, 0.0f);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glVertexPointer(3, GL_FLOAT, sizeof(vec3), &vertices[0]);
glTexCoordPointer(2, GL_FLOAT, sizeof(vec2), &texVertices[0]);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_LIGHTING);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBindTexture(GL_TEXTURE_2D, arrowTexture);
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisable(GL_BLEND);
glEnable(GL_LIGHTING);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
我看到的结果是黑色背景上的箭头,我对此感到很困惑。非常感谢您对此的任何帮助/想法/建议,请事先感谢您。
答案 0 :(得分:0)
我设法找出了为什么我得到黑色背景而不是正确混合的根本原因。只需在此处发布,以防有人面临同样的问题: 我忘了将对象w.r.t渲染到它们的距离,最远的距离,因此,OpenGL将我的纹理与glClearColor(黑色)混合在一起。显而易见,当我现在看着它,但它几乎让我绝望。另一件事; glDisable(GL_LIGHTING)虽然确实让我的箭看起来更好,但并不是那么重要。缺少的部分是用glDepthFunc(GL_ALWAYS)关闭深度测试。