2

我以 GLPaint 为例...我正在尝试将背景放入“PaintingView”中,这样​​您就可以在背景上绘制,最后将图像保存为文件......我迷路了。

我正在加载 PNG (512x512) 并尝试在程序一开始就“用它绘画”,但它被绘制为 64x64 而不是 512x512 ......

我之前尝试加载是作为绘画视图的子视图......但是,glReadPixels 没有按预期工作(它只考虑到绘画视图,而不是子视图)。此外,paintingView 没有像 initWithImage 这样的方法...我需要 glReadPixels 处理图像(以及修改中),但我真的不知道为什么当我加载它时,纹理的大小为 64x64。

4

2 回答 2

2

GLPaint 示例项目使用 GL_POINT_SPRITE 在您移动画笔时绘制画笔纹理的副本。在 iPhone 上,glPointSize 被限制为 64x64 像素。这是一个硬件限制,在模拟器中我认为你可以把它做得更大。

听起来您正在尝试使用 GL_POINT_SPRITE 方法来绘制背景图像,而这确实不是您想要的。相反,请尝试绘制一个填充屏幕的平面纹理框。

这是一些 OpenGL 代码,它为 2D 框设置顶点和 texcoords,然后绘制它:

const GLfloat verticies[] = {
        0.0f, 0.0f,
        1.0f, 0.0f,
        0.0f, 1.0f,
        1.0f, 1.0f,
    };

    const GLfloat texcoords[] = {
        0, 0,
        1, 0,
        0, 1,
        1, 1,
    };

    glVertexPointer(2, GL_FLOAT, 0, verticies);
    glEnableClientState(GL_VERTEX_ARRAY);
    glTexCoordPointer(2, GL_FLOAT, 0, texcoords);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glEnable(GL_TEXTURE_2D);

    glBindTexture(GL_TEXTURE_2D, texture);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

希望有帮助!请注意,您需要根据相机投影的设置方式指定不同的顶点。就我而言,我使用下面的代码设置了我的 GL_MODELVIEW - 我不确定 GLPaint 示例是如何做到的。

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glOrtho(0, 1.0, 0, 1.0, -1, 1);
于 2009-06-05T19:03:34.250 回答
0

首先,glReadPixels()只会查看与当前 OpenGL 上下文相关联的帧缓冲区。这可以解释为什么您没有得到您期望的像素。

其次,以特定像素大小渲染纹理是什么意思?我假设纹理被渲染为一个四边形,然后这个四边形的大小应该在你的控制之下,代码方面。

另外,检查纹理的加载不会产生OpenGL 错误,我不确定 iPhone 对纹理大小的限制是什么。512x512超出范围是完全可以想象的。您当然可以通过调用glGetIntegerv()和使用GL_MAX_TEXTURE_SIZE常量来自己研究这个问题。

于 2009-06-03T11:59:07.260 回答