我正在通过IP链接发送一个opengl 3D场景到我使用SDK 4.1构建的iPhone应用程序。我首先使用FBO渲染3D场景,使用glReadPixels读取它并将其发送到iphone应用程序。如果我将应用程序收到的像素数据转换为UIImage,我看到它显示正确。但是当我使用opengl es 1.1(在iPhone 3G上)在glTexSubImage2D中使用相同的数据时,我什么都看不到。什么想法可能会出错?我使用glTexSubImage2D,因为不支持glDrawPixels。任何示例/教程来解决这个问题?感谢任何帮助。
提前致谢。
Code -
- (id) initWithFrame: (CGRect) frame
{
.....
api = kEAGLRenderingAPIOpenGLES1;
m_context = [[EAGLContext alloc] initWithAPI:api];
glGenFramebuffersOES(1, &m_frameBuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, m_frameBuffer);
glGenRenderbuffersOES(1, &m_colorRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorRenderbuffer);
glGenTextures(1, &m_tex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL);
....
}
- (void) drawView: (CADisplayLink*) displayLink
{
glBindTexture(GL_TEXTURE_2D, m_tex);
glTexSubImage2D(GL_TEXTURE_2D, 0,0,0,
WIDTH, HEIGHT,
GL_BGRA,
//GL_RGBA,
GL_UNSIGNED_BYTE,
m_pixelData);
const GLfloat quadVertices[] = {
-1.0f, -1.0f, 0.0f,
-1.0f, 1.0f, 0.0f,
1.0f, 1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
-1.0f, -1.0f, 0.0f
};
// Sets up an array of values for the texture coordinates.
const GLfloat quadTexcoords[] = {
0.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
1.0f, 0.0f,
0.0f, 0.0f
};
glVertexPointer(3, GL_FLOAT, 0, quadVertices);
glEnableClientState(GL_VERTEX_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, quadTexcoords);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, m_frameBuffer);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 5);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorRenderbuffer);
[m_context presentRenderbuffer:GL_RENDERBUFFER_OES];
}
答案 0 :(得分:0)
如果您对GL_*_MIPMAP_*
使用GL_TEXTURE_[MIN|MAG]_FILTER
(请注意defaults!),请确保您实际提供所有mipmap级别的图像数据。
答案 1 :(得分:0)
请记住,iphone / ipad平台上的纹理宽度和高度需要为2的幂。如果不是,你会得到一个空白的屏幕。
答案 2 :(得分:0)
为什么使用5个顶点组成三角形条?我想你想要的是一个由2个三角形组成的正方形,因此你的条带只需要4个顶点。
另外,在你的情况下,初始化方形纹理并像这样渲染(不使用顶点)会更容易:
/* do the glGenTextures() / glTexImage() / glBindTexture() dance here */
int box[] = { nXOffset, nYOffset, nWidth, nHeight }; /* define the part of the texture you're going to render */
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, box);
glDrawTexfOES(0.0f, 0.0f, 0.0f, nWidth, nHeight); /* rectangle in the screen coordinates, where to render the previously defined part of the texture */