OPenGL---传统学习入门的所学习的部分,计算机图形学远远不是这么这么简单
图形个图像是有很大的区别的
直观的解释就是:图像——计算机视觉的目的是输入图像理解其中的信息
图形——图形学是将我们了解到的信息和知识转变为图形
我们要做的是生成,可以从物理出发也可以从规则出发,当然也可以从大数据出发(这样的话就涉及到深度学习的Gan网络)
计算机图形学是用来生成数字内容的技术
关于源编程
什么是源编程——源编程的概念在编程之上
传统代码——代码生成结果
我们生成一部分代码,让这些代码实例化,再由这些代码去生成我们需要的东西
需要用到的部分:在并行计算中使用模板以及使用编译器优化代码
在并行计算中写一个库(这个库2D和3D都可以使用的时候)
#一个天真的实现方法
def copy_4(src,dst):
for i in range(4):
dst[i] = src[i]
a = ti.field(ti.f32, shape=4)
b = ti.field(ti.f32, shape=4)
copy_4(a,b)
#提高复用性
def copy(src,dst,size):
for i in range(size):
dst[i] = src[i]
a = ti.field(ti.f32, shape=4)
b = ti.field(ti.f32, shape=4)
c = ti.field(ti.f32, shape=12)
d = ti.field(ti.f32, shape=12)
copy(a,b,4)
copy(c,d,12)
#使用并行计算,这个template可以接受任何类型的数组,类似于泛型?,会自动匹配,使用这个模板都是引用传递
@ti.kernel
def copy(src: ti.template(),dst:ti.template(),size: ti.i32):
for i in range(size):
dst[i] = src[i]
a = ti.field(ti.f32, shape=4)
b = ti.field(ti.f32, shape=4)
c = ti.field(ti.f32, shape=12)
d = ti.field(ti.f32, shape=12)
copy(a,b,4)
copy(c,d,12)
#使用template的限制 ,若是field全局的变量就可以都被修改
vec = ti.Vector([0.0,0.0])
@ti.kernel
def my_kernel(x: ti.template()):
x[0] = 2.0#这就是错误方法无法执行
vec2 = x
vec2[0] = 2.0 #这样是可行的
print(vec2)
注意在ti.func中使用的话传递的是引用,也就是说在func中改变数据的值夜会改变源数据的值
#值传递使用的是引用
@ti.func
def my_func(x: ti.template()):
x += 1 #这个值会改变源数据
@ti.kernel
def my_kernel():
x = 24
my_func(x)#这个值在func里面被加一后再外面也会被加一
print(x)#25
my_kernel()
基于此,其实size也没有必要存留了
@ti.kernel
def copy(src:ti.template(),dst:ti.template()):
for i in src:
dst[i] = src[i]
这样所做的拷贝都可以执行,其中只要shape一样就可以了
但这样会有一个新的问题
#但是这个时候又会出现另一个问题,就是
c = ti.Vector.field(ti.f32,shape=(12,24))
d = ti.Vector.field(ti.f32,shape=(12,24))
copy(c,d)#这样不能执行,因为有多个维度
#可能需要写多个函数
#基于此的解决方法就是
def copy(x:ti.template(),y:ti.template()):
for I in ti.grouped(y):
# if y is 0D ,then I = ti.Vector([])
# if y is 1D ,then I = ti.Vector([i])
# if y is 2D ,then I = ti.Vector([i,j])
# if y is 3D ,then I = ti.Vector([i,j,k])
# ...
x[I] = y[I]
有点像C++中的部分操作,和C++模板类似,在实例化的时候生成一个新的kernel
之后还有一个代码加速的部分,ti.static(),这都是给编译器给的代码