背景:
在live2D调用live2D.draw()渲染glkview的情况下,加载背景图片导致图片变形。
后加入顶点数据解析方式glVertexAttribPointer此方法。
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
第一个参数指定从索引0开始取数据,与顶点着色器中layout(location=0)对应。
第二个参数指定顶点属性大小。
第三个参数指定数据类型。
第四个参数定义是否希望数据被标准化(归一化),只表示方向不表示大小。
第五个参数是步长(Stride),指定在连续的顶点属性之间的间隔。上面传0和传4效果相同,如果传1取值方式为0123、1234、2345……
第六个参数表示我们的位置数据在缓冲区起始位置的偏移量。
具体代码如下:
/* 加载背景图片*/
var effect:GLKBaseEffect = GLKBaseEffect()
var bufferID : GLuint = GLuint()
override func viewDidLoad() {
super.viewDidLoad()
setUpVertexData()
setImage()
}
// MARK: - GLKViewDelegate
override func glkView(_ view: GLKView, drawIn rect: CGRect) {
glClearColor(rgb[0] / 255.0, rgb[1] / 255.0, rgb[2] / 255.0, 1.0)
glClear(GLbitfield(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT))
effect.prepareToDraw()
glEnableVertexAttribArray(0)
//顶点数据解析方式
glVertexAttribPointer(
0,
3,
GLenum(GL_FLOAT),
GLboolean(UInt8(GL_FALSE)),
GLsizei(MemoryLayout<GLfloat>.size * 5),
nil
)
glDrawArrays(GLenum(GL_TRIANGLES), 0, 6)
// let delta = updateFrame()
// live2DModel.updatePhysics(Float(delta))
// let value = Float32((cos(lastFrame) + 1.0) / 2.0)
// live2DModel.setParam("ParamBreath", value: value)
// live2DModel.update()
// live2DModel.draw()
}
func setUpVertexData(){
let vertexs:[GLfloat] = [
1.0, -1.0, 0.0, 1.0, 0.0, //右下
1.0, 1.0, -0.0, 1.0, 1.0, //右上
-1.0, 1.0, 0.0, 0.0, 1.0, //左上
1.0, -1.0, 0.0, 1.0, 0.0, //右下
-1.0, 1.0, 0.0, 0.0, 1.0, //左上
-1.0, -1.0, 0.0, 0.0, 0.0, //左下
]
effect.useConstantColor = GLboolean(UInt8(GL_TRUE))
effect.constantColor = GLKVector4Make(1, 1, 1, 1)
glGenBuffers(1, &bufferID)
glBindBuffer(GLenum(GL_ARRAY_BUFFER), bufferID)
let size = MemoryLayout<[GLfloat]>.size * 30
glBufferData(GLenum(GL_ARRAY_BUFFER), size, vertexs, GLenum(GL_STATIC_DRAW))
glEnableVertexAttribArray(GLuint(GLKVertexAttrib.position.rawValue))
glVertexAttribPointer(GLuint(GLKVertexAttrib.position.rawValue), 3, GLenum(GL_FLOAT), GLboolean(GL_FALSE), GLsizei(MemoryLayout<GLfloat>.size * 5), UnsafeRawPointer(bitPattern: 0))
glEnableVertexAttribArray(GLuint(GLKVertexAttrib.texCoord0.rawValue))
glVertexAttribPointer(GLuint(GLKVertexAttrib.texCoord0.rawValue), 2, GLenum(GL_FLOAT), GLboolean(GL_FALSE), GLsizei(MemoryLayout<GLfloat>.size * 5), UnsafeRawPointer(bitPattern: MemoryLayout<GLfloat>.size * 3))
}
func setImage() {
guard let imagePath = Bundle.main.path(forResource: "back1", ofType: "jpeg", inDirectory: nil),
let image = UIImage(contentsOfFile: imagePath)?.cgImage
else {
return
}
let texture = try? GLKTextureLoader.texture(with: image, options: [GLKTextureLoaderOriginBottomLeft:true,GLKTextureLoaderGrayscaleAsAlpha:true,GLKTextureLoaderApplyPremultiplication:true])
effect = GLKBaseEffect()
if let textureInfo = texture{
effect.texture2d0.enabled = GLboolean(GL_TRUE)
effect.texture2d0.name = textureInfo.name
}
}
网友评论