1

我有一个适用于 iOS 的 OpenGL 程序。

我想要一个重复的纹理。通常这对我来说没什么大不了的,因为 GL_REPEAT 做得很好。

比较接下来的两张图片,您可以看到问题:第一张图片是模拟器截图。一切正常。第二张图片是 iPad 截图。纹理将重复一次并夹紧到边缘。请注意,图像在每个方向上重复了 4 次。红色区域是一个方向的纹理坐标> 1.0的区域。所以设备显示图像(正常区域)重复图像(红色区域)然后钳位图像。

这就是它在模拟器中的样子和样子

这是它在设备上的样子

所以我将展示我如何渲染四边形。

我设置了纹理

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);

_location = location;

_texture = [self setupTextureByUIImage:[UIImage imageNamed:name]];
_uniform = uniform;

setUpTextureByUIImage 函数是

- (GLuint) setupTextureByUIImage: (UIImage*) image {
// We want to display images

glActiveTexture(_location);
GLuint texture;
// Generate textures
glGenTextures(1, &texture);
// Bind it
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);

glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);


// Get Image size
GLuint width = CGImageGetWidth(image.CGImage);
GLuint height = CGImageGetHeight(image.CGImage);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
// Allocate memory for image
void *imageData = malloc( height * width * 4 );
CGContextRef imgcontext = CGBitmapContextCreate( imageData, width, height, 8, 4 * width, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big );
CGColorSpaceRelease( colorSpace );
CGContextClearRect( imgcontext, CGRectMake( 0, 0, width, height ) );
CGContextTranslateCTM( imgcontext, 0, height - height );
CGContextDrawImage( imgcontext, CGRectMake( 0, 0, width, height ), image.CGImage );

// Generate texture in opengl
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData);
// Release context
CGContextRelease(imgcontext);
// Free Stuff
free(imageData);

return texture;
}

设置完成后,我开始绘制一个对象。首先我调用makeActiveAndBind。然后我画。然后我调用unbind。

    - (void) makeActiveAndBind
{
    glActiveTexture(_location);
    glBindTexture(GL_TEXTURE_2D, _texture);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glUniform1i(_uniform, _location - GL_TEXTURE0);
}

- (void) unbind
{
    glBindTexture(GL_TEXTURE_2D, 0);
}

有人对这种奇怪的行为有任何想法吗?立方体的纹理坐标为 [0,4]x[0,4]

4

0 回答 0