我正在绘图应用程序,我注意到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混合逻辑(或选项).
检查与拖动速度成比例的插值逻辑.
似乎你没有第二个或没有效果,这是绘制应用程序所必需的