ios – iPad纹理加载差异(32位与64位)

我正在绘图应用程序,我注意到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,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,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,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,&vertexBuffer[0].Color[0]);
    glTexCoordPointer(2,&vertexBuffer[0].Texture[0]);
    glDrawArrays(GL_TRIANGLES,(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位)全部内容,希望文章能够帮你解决ios – iPad纹理加载差异(32位与64位)所遇到的程序开发问题。

如果觉得来客网网站内容还不错,欢迎将来客网网站推荐给程序员好友。