在iPhone上以OpenGL es 2.0显示图像

在iPhone上以OpenGL es 2.0显示图像,iphone,image,opengl-es,Iphone,Image,Opengl Es,所以我刚开始在OpenGLES2.0中开发一些东西。我得到的总体印象是,在Xcode中从1.1模板切换到2.0模板对每个人都造成了一些混乱,因此,2.0没有太大的帮助(如果有什么真正好的和有用的东西,比如除2.0之外的71squared在1.1模板上的视频,欢迎您发布链接) 我的问题是在屏幕上显示图像 现在,我在我的drawFrame方法中得到了这个 [(EAGLView *)self.view setFramebuffer]; // Replace the implementation of

所以我刚开始在OpenGLES2.0中开发一些东西。我得到的总体印象是,在Xcode中从1.1模板切换到2.0模板对每个人都造成了一些混乱,因此,2.0没有太大的帮助(如果有什么真正好的和有用的东西,比如除2.0之外的71squared在1.1模板上的视频,欢迎您发布链接)

我的问题是在屏幕上显示图像

现在,我在我的drawFrame方法中得到了这个

[(EAGLView *)self.view setFramebuffer];

// Replace the implementation of this method to do your own custom drawing.
    static float transY = 0.0f;

glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
 [playerCube drawAtPoint:CGPointMake(160.0f, 240.0f)];


if ([context API] == kEAGLRenderingAPIOpenGLES2)
{
    // Use shader program.
    glUseProgram(program);

    // Update uniform value.
    glUniform1f(uniforms[UNIFORM_TRANSLATE], (GLfloat)transY);
    transY += 0.075f; 


    // Validate program before drawing. This is a good check, but only really necessary in a debug build.
    // DEBUG macro must be defined in your debug configurations if that's not already the case.

    if (![self validateProgram:program])
    {
        NSLog(@"Failed to validate program: %d", program);
        return;
    }
}
else
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0.0f, (GLfloat)(sinf(transY)/2.0f), 0.0f);
    transY += 0.075f;
 }

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);



[(EAGLView *)self.view presentFramebuffer];
基本上是模板,没有方形的反弹。顺便说一下,这是在我的ViewController.m中。它自己就可以很好地工作。不过,我在显示图像的代码方面运气不太好。我使用的是苹果崩溃着陆示例中的Texture2D文件,但无论图像相关代码放在哪里,我都没有太多的运气

我使用了
playerCube=[[Texture2D alloc]initWithImage:[UIImage ImageName:@“Cubix.png”]来分配它,即使我没有把它放在正确的位置,这可能是正确的,并且
[playerCube drawAtPoint:CGPointMake(160.0f,240.0f)]

等等,这不会在开始时显示任何内容,因为我没有正确设置图像的高度和宽度?我想我回答了我问题的这一部分。如果我使用像
image.frame=CGRectMake()这样的东西,它会工作吗或者这对纹理2D不起作用?还有,我应该把这个代码放在哪里,让它能够正常工作


希望我在这方面有点道理。我以前从未发布过关于StackOverflow的问题。

在《崩溃着陆》中介绍的Texture2D不适合与ES 2.x一起使用。它应该可以正确上传纹理,但是两种绘制方法,
drawAtPoint:
drawInRect:
都不起作用。它们依赖于GL调用glVertexPointer和glTexCoordPointer;这两种方法都不能存活到ES 2.x中。其背后的逻辑是,ES 1.x有一个固定的管道,因此它有一个定义的顶点位置槽(使用
glVertexPointer
),一个定义的纹理坐标槽(通过
glTexCoordPointer
),以及一系列预定义的方法,这些数据最终可以通过这些方法进行处理。ES 2.x是完全可编程的,因此它不需要提供一种方法来提供顶点,另一种方法用于提供纹理坐标,第三种方法用于颜色等。它只有一种方法来提供顶点属性,由您指定如何与顶点程序相关联,然后转到顶点程序,找出需要处理的内容并传递给片段着色器

实际上,您不应该将提供纹理和提供几何体混为一谈。迫降被撤回是因为它暗示了糟糕的编程模式——我个人怀疑这就是其中之一

除了没有固定的顶点属性外,ES 2.x不提供任何片段着色器。如果要创建纹理贴图,必须编写合适的顶点和片段着色器。新GL模板中的那些仅在我回忆起的情况下才进行Gouraud着色

代码中暗示的另一个问题是ES2.x没有矩阵堆栈。您需要自己做一些事情来与顶点着色器通信它应该如何从原始顶点映射到屏幕位置。我想如果你只是想画一个2d的纹理,那就没什么问题了

正确的前进路线可能是:

  • 修改Texture2D,使其可以绑定已加载的纹理并删除所有绘制尝试
  • 修改GL模板中提供的顶点和片段着色器以进行纹理处理,并修改提交的缓冲区,使其具有纹理坐标
  • 然后修改顶点着色器,以便可以执行正弦动画以外的操作

如果你已经对ES1.x感到满意,那么也许一个好的开始就是——尽管这是桌面OpenGL2.0。在desktop GL 2.0中,GLSL内置了大量支持,用于模拟旧的固定管道。这些都不在ES2.x中。但它至少应该解释有关属性、制服、采样器等方面的内容。恐怕我还没有遇到过一个ES 2.x聚焦教程。

我演示了如何在iPhone上的OpenGL ES 2.0中将图像显示为纹理,其中图像是来自相机的视频帧,以及如何将PVR压缩纹理作为图像拉入。前一个例子在本文中描述

我在OpenGL ES 2.0类的视频中描述了顶点和片段着色器的工作原理,以及它们的所有支持代码,这是我免费提供的iOS开发课程的一部分。此外,我强烈建议您阅读Jeff LaMarche未出版的OpenGL ES 2.0书籍中的内容

简言之,加载纹理后,需要使用如下代码将其作为统一体附加到着色器程序:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, myTexture);
glUniform1i(myTextureUniform, 0);   
在片段着色器中,需要定义均匀纹理:

uniform sampler2D myTexture;
然后在适当的点从纹理中采样颜色:

gl_FragColor = texture2D(myTexture, textureCoordinate);

同样,我在课堂上更详细地讨论了这一点,您可以使用这些示例作为工作的起点。

无需担心,我不确定我是否回答了自己的问题。Texture2D类可以处理任意大小的图像,因此如果宽度和高度有帮助,请点击Idk。非常感谢。我会试着这样做,看看是否有效。我不认为我对ES 1.x完全满意,但我认为它必须在iOS3.1和更早版本中实现,对吗?ES 1.x在所有配备PowerVR MBX GPU的设备上都是可用的(也是唯一可用的),这是最早的iPhone、iPhone 3G和前两代iPod Touch。ES 1.x和2.x都可以在所有配备PowerVR SGX的设备上使用——iPhone3GS、iPhone4、iPad和第三代和第四代iPodTouch。这都是关于硬件的。虽然我认为