GLKit纹理锯齿状

时间:2016-11-12 09:52:09

标签: ios swift opengl-es glkit

我正在尝试实现GLKit纹理绘画,它看起来过于锯齿状 example

从.png创建纹理,从Apple的GLPaing示例中获取此代码

    private func texture(fromName name: String) -> textureInfo_t {
    var texId: GLuint = 0
    var texture: textureInfo_t = (0, 0, 0)
    let brushImage = UIImage(named: name)!.cgImage!
    let width: size_t = brushImage.width
    let height: size_t = brushImage.height
    var brushData = [GLubyte](repeating: 0, count: width * height * 4)
    let bitmapInfo = CGImageAlphaInfo.premultipliedLast.rawValue
    let brushContext = CGContext(data: &brushData, width: width, height: height, bitsPerComponent: 8, bytesPerRow: width * 4, space: (brushImage.colorSpace!), bitmapInfo: bitmapInfo)
    brushContext?.draw(brushImage, in: CGRect(x: 0.0, y: 0.0, width: width.g, height: height.g))
    glGenTextures(1, &texId)
    // Bind the texture name.
    glBindTexture(GL_TEXTURE_2D.ui, texId)
    // Set the texture parameters to use a minifying filter and a linear filer (weighted average)
    glTexParameteri(GL_TEXTURE_2D.ui, GL_TEXTURE_MIN_FILTER.ui, GL_LINEAR)
    // Specify a 2D texture image, providing the a pointer to the image data in memory
    glTexImage2D(GL_TEXTURE_2D.ui, 0, GL_RGBA, width.i, height.i, 0, GL_RGBA.ui, GL_UNSIGNED_BYTE.ui, brushData)
    // Release  the image data; it's no longer needed
    texture.id = texId
    texture.width = width.i
    texture.height = height.i
    return texture
}

绘画时渲染

    private func renderLine(from _start: CGPoint, to _end: CGPoint) {
    struct Static {
        static var vertexBuffer: [GLfloat] = []
    }
    var count = 0
    EAGLContext.setCurrent(context)
    glBindFramebuffer(GL_FRAMEBUFFER.ui, viewFramebuffer)
    // Convert locations from Points to Pixels
    let scale = self.contentScaleFactor
    var start = _start
    start.x *= scale
    start.y *= scale
    var end = _end
    end.x *= scale
    end.y *= scale
    // Allocate vertex array buffer
    // Add points to the buffer so there are drawing points every X pixels
    count = max(Int(ceilf(sqrtf((end.x - start.x).f * (end.x - start.x).f + (end.y - start.y).f * (end.y - start.y).f) / kBrushPixelStep.f)), 1)
    Static.vertexBuffer.reserveCapacity(count * 2)
    Static.vertexBuffer.removeAll(keepingCapacity: true)
    for i in 0..<count {
        Static.vertexBuffer.append(start.x.f + (end.x - start.x).f * (i.f / count.f))
        Static.vertexBuffer.append(start.y.f + (end.y - start.y).f * (i.f / count.f))
    }
    // Load data to the Vertex Buffer Object
    glBindBuffer(GL_ARRAY_BUFFER.ui, vboId)
    glBufferData(GL_ARRAY_BUFFER.ui, count*2*MemoryLayout<GLfloat>.size, Static.vertexBuffer, GL_DYNAMIC_DRAW.ui)
    glEnableVertexAttribArray(ATTRIB_VERTEX.ui)
    glVertexAttribPointer(ATTRIB_VERTEX.ui, 2, GL_FLOAT.ui, GL_FALSE.ub, 0, nil)
    // Draw
    glUseProgram(program[PROGRAM_POINT].id)
    glDrawArrays(GL_POINTS.ui, 0, count.i)
    // Display the buffer
    glBindRenderbuffer(GL_RENDERBUFFER.ui, viewRenderbuffer)
    context.presentRenderbuffer(GL_RENDERBUFFER.l)
}

我怎样才能提高纹理质量?

更新: 即使分辨率更高.png结果相同。我做错了什么? 有1024x1024 .png,透明背景我正在使用: png

0 个答案:

没有答案