ios-将4x4矩阵传递给glUniformMatrix4fv [英] ios - pass a 4x4 matrix to glUniformMatrix4fv

查看:487
本文介绍了ios-将4x4矩阵传递给glUniformMatrix4fv的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将4x4矩阵传递给glUniformMatrix4fv,但无法弄清最后一位.我通过直接输入16个值来创建4x4. glUniformMatrix4fv除了UnsafePointer<GLfloat>!作为最后一个参数

I'm trying to pass a 4x4 matrix to glUniformMatrix4fv but can't figure out the last bit. I create a 4x4 by directly inputing 16 values. glUniformMatrix4fv excepts an UnsafePointer<GLfloat>! as its last argument

var proj = GLKMatrix4(m: (
    -1.1269710063934326,
    0.0,
    -1.380141455272968e-16,
    0.0,
    0.0,
    0.800000011920929,
    0.0,
    0.0,
    0.0,
    -0.0,
    0.0,
    -4.950000286102295,
    -1.2246468525851679e-16,
    0.0,
    1.0,
    5.050000190734863)
)
var loc = GLint(_locations.uniforms.projection)
var f = GLboolean(GL_FALSE)

第一次尝试:

glUniformMatrix4fv(loc, 1, f, proj.m)

提高

Cannot convert value of type '(Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float)' to expected argument type 'UnsafePointer<GLfloat>!'

第二次尝试:

glUniformMatrix4fv(loc, 1, f, &proj.m)

提高

Cannot convert value of type '(Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float)' to expected argument type 'GLfloat' (aka 'Float')

第三次尝试

glUniformMatrix4fv(loc, 1, f, &proj)

提高

Cannot convert value of type 'GLKMatrix4' (aka '_GLKMatrix4') to expected argument type 'GLfloat' (aka 'Float')

最后

glUniformMatrix4fv(loc, 1, f, proj)

提高

Cannot convert value of type 'GLKMatrix4' (aka '_GLKMatrix4') to expected argument type 'UnsafePointer<GLfloat>!'

有什么主意吗?

推荐答案

问题"是C数组像

float m[16];

struct _GLKMatrix4中的

被作为 tuple映射到Swift:

public var m: (Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float)

,但是glUniformMatrix4fv()函数需要UnsafePointer<GLfloat> (C中的float *)作为最后一个参数.

but the glUniformMatrix4fv() function expects UnsafePointer<GLfloat> (float * in C) as the last argument.

在C中,数组在传递时会衰减"到指向第一个元素的指针 功能,但在Swift中没有.但是Swift保留了内存布局 导入的C结构,因此您可以将指针传递给元组, 转换为指向GLfloat的指针:

In C, an array "decays" to a pointer to the first element when passed to a function, but not in Swift. But Swift preserves the memory layout of imported C structures, therefore you can pass a pointer to the tuple, converted to a pointer to GLfloat:

// Swift 2:
withUnsafePointer(&proj.m) {
    glUniformMatrix4fv(loc, 1, f, UnsafePointer($0))
}

// Swift 3/4:
let components = MemoryLayout.size(ofValue: proj.m)/MemoryLayout.size(ofValue: proj.m.0)
withUnsafePointer(to: &proj.m) {
    $0.withMemoryRebound(to: GLfloat.self, capacity: components) {
        glUniformMatrix4fv(loc, 1, f, $0)
    }
}

这篇关于ios-将4x4矩阵传递给glUniformMatrix4fv的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆