- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
我正在开发一个绘图应用程序,我注意到在 32 位 iPad 和 64 位 iPad 上加载的纹理存在显着差异。
这是在 32 位 iPad 上绘制的纹理:
这是在 64 位 iPad 上绘制的纹理:
64 位是我想要的,但似乎丢失了一些数据?
我用这段代码创建了一个默认画笔纹理:
UIGraphicsBeginImageContext(CGSizeMake(64, 64));
CGContextRef defBrushTextureContext = UIGraphicsGetCurrentContext();
UIGraphicsPushContext(defBrushTextureContext);
size_t num_locations = 3;
CGFloat locations[3] = { 0.0, 0.8, 1.0 };
CGFloat components[12] = { 1.0,1.0,1.0, 1.0,
1.0,1.0,1.0, 1.0,
1.0,1.0,1.0, 0.0 };
CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB();
CGGradientRef myGradient = CGGradientCreateWithColorComponents (myColorspace, components, locations, num_locations);
CGPoint myCentrePoint = CGPointMake(32, 32);
float myRadius = 20;
CGGradientDrawingOptions options = kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation;
CGContextDrawRadialGradient (UIGraphicsGetCurrentContext(), myGradient, myCentrePoint,
0, myCentrePoint, myRadius,
options);
CFRelease(myGradient);
CFRelease(myColorspace);
UIGraphicsPopContext();
[self setBrushTexture:UIGraphicsGetImageFromCurrentImageContext()];
UIGraphicsEndImageContext();
然后像这样实际设置画笔纹理:
-(void) setBrushTexture:(UIImage*)brushImage{
// save our current texture.
currentTexture = brushImage;
// first, delete the old texture if needed
if (brushTexture){
glDeleteTextures(1, &brushTexture);
brushTexture = 0;
}
// fetch the cgimage for us to draw into a texture
CGImageRef brushCGImage = brushImage.CGImage;
// Make sure the image exists
if(brushCGImage) {
// Get the width and height of the image
GLint width = CGImageGetWidth(brushCGImage);
GLint height = CGImageGetHeight(brushCGImage);
// Texture dimensions must be a power of 2. If you write an application that allows users to supply an image,
// you'll want to add code that checks the dimensions and takes appropriate action if they are not a power of 2.
// Allocate memory needed for the bitmap context
GLubyte* brushData = (GLubyte *) calloc(width * height * 4, sizeof(GLubyte));
// Use the bitmatp creation function provided by the Core Graphics framework.
CGContextRef brushContext = CGBitmapContextCreate(brushData, width, height, 8, width * 4, CGImageGetColorSpace(brushCGImage), kCGImageAlphaPremultipliedLast);
// After you create the context, you can draw the image to the context.
CGContextDrawImage(brushContext, CGRectMake(0.0, 0.0, (CGFloat)width, (CGFloat)height), brushCGImage);
// You don't need the context at this point, so you need to release it to avoid memory leaks.
CGContextRelease(brushContext);
// Use OpenGL ES to generate a name for the texture.
glGenTextures(1, &brushTexture);
// Bind the texture name.
glBindTexture(GL_TEXTURE_2D, brushTexture);
// Set the texture parameters to use a minifying filter and a linear filer (weighted average)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
// Specify a 2D texture image, providing the a pointer to the image data in memory
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, brushData);
// Release the image data; it's no longer needed
free(brushData);
}
}
更新:
我已经将 CGFloats 更新为 GLfloats 但没有成功。也许这个渲染代码有问题?
if(frameBuffer){
// draw the stroke element
[self prepOpenGLStateForFBO:frameBuffer];
[self prepOpenGLBlendModeForColor:element.color];
CheckGLError();
}
// find our screen scale so that we can convert from
// points to pixels
GLfloat scale = self.contentScaleFactor;
// fetch the vertex data from the element
struct Vertex* vertexBuffer = [element generatedVertexArrayWithPreviousElement:previousElement forScale:scale];
glLineWidth(2);
// if the element has any data, then draw it
if(vertexBuffer){
glVertexPointer(2, GL_FLOAT, sizeof(struct Vertex), &vertexBuffer[0].Position[0]);
glColorPointer(4, GL_FLOAT, sizeof(struct Vertex), &vertexBuffer[0].Color[0]);
glTexCoordPointer(2, GL_FLOAT, sizeof(struct Vertex), &vertexBuffer[0].Texture[0]);
glDrawArrays(GL_TRIANGLES, 0, (GLint)[element numberOfSteps] * (GLint)[element numberOfVerticesPerStep]);
CheckGLError();
}
if(frameBuffer){
[self unprepOpenGLState];
}
顶点结构如下:
struct Vertex{
GLfloat Position[2]; // x,y position
GLfloat Color [4]; // rgba color
GLfloat Texture[2]; // x,y texture coord
};
更新:
该问题实际上似乎并非基于 32 位或 64 位,而是 A7 GPU 和 GL 驱动程序有所不同。我通过在 64 位 iPad 上运行 32 位构建和 64 位构建发现了这一点。纹理最终在应用程序的两个版本中看起来完全相同。
最佳答案
我希望你检查两件事。
检查 OpenGL 中的 alpha 混合逻辑(或选项)。
检查与拖动速度成正比的插值逻辑。
看来你没有第二个或者没有效果,这是绘图应用程序所必需的
关于ios - iPad 纹理加载差异(32 位与 64 位),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21689336/
我妻子有一台 iPad,我想知道我是否可以用它来开发 iPad 应用程序?我假设答案是否定的。 最佳答案 Apple 的开发指南禁止商店中的此类应用程序,因此不幸的是,您不能使用 iPad 来制作 i
我开发了一个 iPad 应用程序,并为应用程序商店制作了分发配置文件,我需要在 30 台 iPad 上安装我开发的应用程序以进行一次事件,但我无法安装。我收到错误消息:(应用程序“xxxx”未安装在
我正在佛罗里达州开发一款 iPad/iPhone 应用程序,希望纽约的同事能帮我测试一下。纽约的测试人员没有 iMac,因为他们不在该地点进行任何开发。我只是想让他们验证他们所在位置的操作。有什么方法
我可以检测用户(音乐家)手指施加的力或压力吗? 最佳答案 还没有。 有一个技术演示展示了如何做到这一点。见 http://tenonedesign.com/blog/pressure-sensitiv
浏览器分辨率是多少?我已经在谷歌上搜索了一段时间,但不知何故我找不到它! 最佳答案 960x768 或 704x1024 关于ipad - iPad 的屏幕尺寸减去浏览器中的地址栏是多少?,我们在St
我的应用只能在横向使用,并且只能在横向启动。因此,iPad为横向时,左上角为(0,0),因此一切正常。 但是,当我拿起“ touchesBegan” ...时,它无法正常工作。只有当我像正确的三分之二
我在 ionic 中创建输入,它只接受数字。这适用于除 safari 和 ipad 之外的所有浏览器和设备。我不希望用户输入数字以外的任何内容。我尝试对输入事件进行正则表达式验证,但这并不能阻止用户输
是否可以在 iPad 中显示仅包含 0-9 数字的键盘?,我不希望键盘显示任何其他内容。我知道有这个 键盘类型:数字键盘 我们可以在 .xib 文件中,但它显示所有其他额外的字符,包括数字。我想使用这
我正在做一个SproutCore项目。我试图按原样在IPAD上获取该站点,但是CSS背景图像,onClick和重定向在IPAD上不起作用。 让我知道对此的任何解决方案。 最佳答案 在iPad上进行开发
我已经设置了MFMailComposeViewController,它在iPhone上正常工作,但是在iPad上崩溃了,并说: *** Terminating app due to uncaught
iPad:遍历UITableView中的每个单元格吗? 最佳答案 for (int section = 0; section < [tableView numberOfSections]; secti
我在这里寻找两个数字:纵向高度和横向高度。不要以厘米或英寸为单位回答,而以像素为单位。 最佳答案 纵向高度为 264,横向高度为 352。 我知道这是一个迟到的答案,但我自己也遇到了这个问题。 关于i
在我的应用程序中,我想播放Youtube URL(ipad)。我正在使用下面的代码。它只是向我显示一个白色屏幕 YouTube网址是:http://www.youtube.com/watch?v =
据我所知,iPad 使用 iPhone 操作系统,但屏幕分辨率与 iPhone 和 iPod touch 不同。许多网站可能必须更改其用户代理检测以适应 iPad。 那么,任何有权访问 iPad 或
我想预加载多个音频文件。为此,我尝试在JavaScript中创建多个Audio元素。 function loadAudio(){ audio1 = new Audio(); audio
我想使用适用于在所有最新 iPad 上查看的网页的字体。我找到了给定版本的 IOS 附带的字体列表。但这不是我想要的。我更喜欢给定 iPad 实际附带的字体列表,而不是 IOS 版本。如何解决这个问题
是否有可能拥有一个不在应用商店上架的 iPad 单独应用。该应用程序将在某些选定的成员中使用。因此它不需要进入应用商店,因为它不是供公众使用的。 最佳答案 那么有一些众所周知的可能性: Ad Hoc
子像素字体渲染如 ClearType显着提高字体显示分辨率并提高屏幕可读性。我如何对字体的子像素渲染进行编程(一般而言),以及如何在 iPad 上实现这一点(iOS 设备上的 C、C++ 或 Obje
我正在为 9.7 英寸 iPad 设计一个应用程序。我想知道是否有人对为更大的 iPad 设计的应用程序在 iPad mini 上的外观有任何经验?它会自动缩小,以某种方式在较小的屏幕上完美使用吗?还
我正在使用所有 UIKit,并且出于原型(prototype)设计的目的,我刚刚将所有逻辑插入了主 viewController。我在 viewDidLoad 中创建了一些 UIView,隐藏了一些,
我是一名优秀的程序员,十分优秀!