我是一个新手,并尝试使用OpenGL ES在我的iPhone屏幕上显示一个精灵。 我知道它更简单,更容易做到与cocos2d,但现在我试图直接在OpenGL上编码。 是否有任何简单而有效的方式来加载和显示OpenGL ES中的精灵。我到目前为止发现的情况要复杂得多。 :(如何在用于iphone的OpenGL ES中加载和显示图像
10
A
回答
15
下面是一些代码从束加载PNG:
UIImage* image = [UIImage imageNamed:@"PictureName.png"];
GLubyte* imageData = malloc(image.size.width * image.size.height * 4);
CGContextRef imageContext = CGBitmapContextCreate(imageData, image.size.width, image.size.height, 8, image.size.width * 4, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaPremultipliedLast);
CGContextDrawImage(imageContext, CGRectMake(0.0, 0.0, image.size.width, image.size.height), image.CGImage);
CGContextRelease(imageContext);
下面是一些代码来创建与该图像数据的纹理
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.size.width, image.size.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
而如何的一个例子渲染:
glBindTexture(GL_TEXTURE_2D, texture);
glVertexPointer(2, GL_FLOAT, 0, vertices);
glNormalPointer(GL_FLOAT, 0, normals);
glTexCoordPointer(2, GL_FLOAT, 0, textureCoords);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)
在这里,你需要找到适合你的顶点,法线和textureCoords的值需要。
更新1
一定要设置正确的状态是这样的:
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
如果使用glOrthof
(见下文)在您的应用程序设置一个2D投影,您可以使用这些值:
GLfloat vertices[] = {
-1.0, 1.0,
1.0, 1.0,
-1.0, -1.0,
1.0, -1.0, };
GLfloat normals[] = {
0.0, 0.0, 1.0,
0.0, 0.0, 1.0,
0.0, 0.0, 1.0,
0.0, 0.0, 1.0 };
GLfloat textureCoords[] = {
0.0, 0.0,
1.0, 0.0,
0.0, 1.0,
1.0, 1.0 };
更新2
这是使用上面的代码时呈现精灵怎么坐在投影模式:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(-5.0, 5.0, -7.5, 7.5, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
这也是我怎么设置我的混合功能。这允许在PNG文件中的透明度:
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
4
我建议看看苹果的GLSprite示例应用程序。这正是这个应用程序所做的。
如果你想加载PVRTC压缩纹理,请看他们的PVRTextureLoader例子。我使用我为我的iPhone课写的sample application中的代码。
相关问题
- 1. OpenGL ES 2 - 加载和显示图像
- 2. 如何使用C++在OpenGL ES 3.0中加载和显示图像
- 3. 在OpenGL ES中加载非幂次的图像iPhone
- 4. 如何更改ios中用于OpenGL的图像格式? (将图像加载到OpenGL ES 2.0)
- 5. OpenGL ES 2.0 2D图像显示
- 6. android openGL es 2没有显示图像
- 7. 在iPhone上的OpenGL ES中,如何滚动两个图像?
- 8. 从iPhone中的C++代码将图像载入到OpenGL ES中
- 9. 如何在openGL ES中移动图像?
- 10. 如何在OpenGL ES for iPhone中显示视频?
- 11. iPhone的OpenGL-ES:在OpenGL UISwipeGestureRecognizer
- 12. 如何在加载iphone应用程序时显示图像?
- 13. 异步纹理加载iPhone OpenGL ES 2
- 14. 如何在opengl中加载图像
- 15. OpenGL ES 2.0在iPhone模拟器中显示正常,但在iPhone上不显示
- 16. OpenGL ES 2.0中的图像和蒙版
- 17. 在ActionScript中加载和显示图像
- 18. 如何使用OpenGL ES渲染图像?
- 19. 在opengl中显示图像
- 20. 在openGL中加载图像
- 21. OpenGL ES:在视图下方显示
- 22. 如何在加载大图像时显示加载图像?
- 23. iPhone OpenGL ES - 如何选择
- 24. 在Android的OpenGL ES应用程序开始时显示加载图标
- 25. 如何在视图中自动加载和显示图像(Codeigniter)
- 26. 用于图像处理的OpenGL ES 2.0着色器示例?
- 27. 如何在OpenGL ES中加载和绑定纹理?
- 28. Iphone上的OpenGl ES - 显示和旋转3D对象
- 29. OpenGL ES For iPhone
- 30. iPhone OpenGL ES
哪个版本的OpenGL ES,1或2? – 2010-08-02 11:14:45
我正在使用ES 1. – nomann 2010-08-02 11:15:36