我正在从 Cocoa 应用程序中调整一些 PNG 文件的大小。这些文件最终被另一个应用程序加载为 OpenGL 纹理,并应用了一个编写不佳的着色器,它在某一时刻执行以下操作:
texColor = mix(constant,vec4(texColor.rgb/texColor.a,texColor.a),texColor.a);
除以 alpha 是一个坏主意,解决方案是确保该步骤中 texColor 的 RGB 分量永远不会超过 1。但是!出于好奇:
原始 PNG(在 GIMP 中创建)令人惊讶地工作正常,使用 GIMP 创建的调整大小的版本也工作正常。但是,使用下面的代码调整文件大小会导致纹理在任何透明像素附近出现锯齿,即使percent
是1.0
. 知道我在不知不觉中改变了这些突然导致着色器错误出现的图像是什么吗?
NSImage* originalImage = [[NSImage alloc] initWithData:[currentFile regularFileContents]];
NSSize newSize = NSMakeSize([originalImage size].width * percent, [originalImage size].height * percent);
NSImage* resizedImage = [[NSImage alloc] initWithSize:newSize];
[resizedImage lockFocus];
[originalImage drawInRect:NSMakeRect(0,0,newSize.width,newSize.height)
fromRect:NSMakeRect(0,0,[originalImage size].width, [originalImage size].height)
operation:NSCompositeCopy fraction:1.0];
[resizedImage unlockFocus];
NSBitmapImageRep* bits = [[[NSBitmapImageRep alloc] initWithCGImage:[resizedImage CGImageForProposedRect:nil context:nil hints:nil]] autorelease];
NSData* data = [bits representationUsingType:NSPNGFileType properties:nil];
NSFileWrapper* newFile = [[[NSFileWrapper alloc] initRegularFileWithContents:data] autorelease];
[newFile setPreferredFilename:currentFilename];
[folder removeFileWrapper:currentFile];
[folder addFileWrapper:newFile];
[originalImage release];
[resizedImage release];