我正在尝试使用openGL ES(适用于iPhone)渲染为纹理,然后在屏幕上显示该纹理。一切正常,除了纹理顶部有32行的间隙,底部32行被切除。就像我的所有图形都向下偏移了32个像素,这导致底部32行未绘制,因为它们在纹理外部。

这是一个非常简单的示例:

void RenderToTexture( int texture )
{
    unsigned char buffer[4 * 320 * 480];
    unsigned char colour[4];
    colour[0] = 255;
    colour[1] = 0;
    colour[2] = 0;
    colour[3] = 128;
    for ( int i = 0; i < 4 * 320 * 480; i += 4 )
    {
        buffer[i] = colour[0];
        buffer[i+1] = colour[1];
        buffer[i+2] = colour[2];
        buffer[i+3] = colour[3];
    }
    glBindTexture( GL_TEXTURE_2D, texture );
    glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 320, 480, GL_RGBA, GL_UNSIGNED_BYTE, buffer );
}


结果如下:

iphone - opengl es纹理顶部的32像素间隙-LMLPHP


仅使用glColor4f()设置颜色,而不是调用RenderToTexture()会导致红色屏幕,如预期的那样。

最佳答案

那32个像素是512的缺失像素:512-480 = 32。
原因是GL_TEXTURE_2D只能使用为2的幂的纹理大小。
因此,您必须将宽度和高度四舍五入为512。通过使用纹理坐标或设置纹理矩阵,您仍然可以仅显示所需纹理的一部分。

关于iphone - opengl es纹理顶部的32像素间隙,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1592713/

10-14 23:29