zoukankan
html css js c++ java
用汇编语言写的光线追踪核心求交代码
__asm
{
//
dot_nd = - ( normal.x * ray_dir.x + normal.y * ray_dir.y + normal.z * ray_dir.z );
//
optimized version :
//
xmm0 <--------------------------- 0
//
xmm1
//
xmm2
//
xmm3 <--------------------------- ray->src
//
xmm4 <--------------------------- ray->dir
//
xmm5 <--------------------------- dot_nd
//
xmm6 <--------------------------- t
//
xmm7
xorps xmm0, xmm0 ;
mov ebx, dword ptr ray ;
mov edi, dword ptr state ;
mov esi, dword ptr
this
;
movaps xmm3, xmmword ptr [ebx]e_Ray.src ;
movaps xmm4, xmmword ptr [ebx]e_Ray.dir ;
movaps xmm5, xmmword ptr [esi]
this
.normal ;
movaps xmm6, xmm5 ;
prefetchnta
byte
ptr [esi
+
TYPE
this
] ;
movaps xmm7, xmm4 ;
mulps xmm5, xmm7 ;
movhlps xmm7, xmm5 ;
addss xmm7, xmm5 ;
shufps xmm5, xmm5,
1
;
addss xmm7, xmm5 ;
movaps xmm5, xmm0 ;
subss xmm5, xmm7 ;
//
if( dot_nd <= 0.0f )
comiss xmm0, xmm5 ;
movss dword ptr dot_nd, xmm5 ;
//
return false;
jae RETURN_FALSE ;
;
161
: t
=
ray_src.x
*
normal.x
+
ray_src.y
*
normal.y
+
ray_src.z
*
normal.z
+
normal.w;
movaps xmm7, xmm3 ;
mulps xmm7, xmm6 ;
movhlps xmm6, xmm7 ;
addss xmm6, xmm7 ;
shufps xmm7, xmm7,
253
;
addss xmm6, xmm7 ;
movhlps xmm7, xmm7 ;
addss xmm6, xmm7 ;
//
if( t <= t_near * dot_nd )
movss xmm7, dword ptr [ebx]e_Ray.t_near ;
mulss xmm7, xmm5 ;
comiss xmm7, xmm6 ;
movss dword ptr t, xmm6 ;
//
return false;
jae RETURN_FALSE ;
//
t_far = MIN( ray->t_far, state->t );
movss xmm7, dword ptr [edi]e_RayState.t ;
comiss xmm7, dword ptr [ebx]e_Ray.t_far ;
jbe CASE_BELOW ;
movss xmm7, dword ptr [ebx]e_Ray.t_far ;
CASE_BELOW:
//
if( t >= t_far * dot_nd )
mulss xmm7, xmm5 ;
comiss xmm6, xmm7 ;
//
return false;
jae RETURN_FALSE ;
//
hit.arr[ projX ] = ray_src.arr[ projX ] * dot_nd + ray_dir.arr[ projX ] * t;
movzx eax,
byte
ptr [esi]
this
.projX ;
add eax, eax ;
add eax, eax ;
movss xmm1, dword ptr [ebx
+
eax]e_Ray.src ;
movss xmm2, dword ptr [ebx
+
eax]e_Ray.dir ;
mulss xmm1, xmm5 ;
mulss xmm2, xmm6 ;
addss xmm1, xmm2 ;
movss dword ptr [hit
+
eax], xmm1 ;
//
hit.arr[ projY ] = ray_src.arr[ projY ] * dot_nd + ray_dir.arr[ projY ] * t;
movzx ecx,
byte
ptr [esi]
this
.projY ;
add ecx, ecx ;
add ecx, ecx ;
movss xmm1, dword ptr [ebx
+
ecx]e_Ray.src ;
movss xmm2, dword ptr [ebx
+
ecx]e_Ray.dir ;
mulss xmm1, xmm5 ;
mulss xmm2, xmm6 ;
addss xmm1, xmm2 ;
movss dword ptr [hit
+
ecx], xmm1 ;
//
bary.x = hit.arr[ projX ] * la.x + hit.arr[ projY ] * la.y + la.z * dot_nd;
movss xmm7, dword ptr [esi]
this
.la.x ;
mulss xmm7, dword ptr [hit
+
eax] ;
movss xmm1, dword ptr [esi]
this
.la.y ;
mulss xmm1, dword ptr [hit
+
ecx] ;
addss xmm7, xmm1 ;
movss xmm1, dword ptr [esi]
this
.la.z ;
mulss xmm1, xmm5 ;
addss xmm7, xmm1 ;
//
if( bary.x < 0.0f || bary.x > dot_nd )
comiss xmm0, xmm7 ;
ja RETURN_FALSE ;
comiss xmm7, xmm5 ;
ja RETURN_FALSE ;
//
bary.y = hit.arr[ projX ] * lb.x + hit.arr[ projY ] * lb.y + lb.z * dot_nd;
movss xmm2, dword ptr [esi]
this
.lb.x ;
mulss xmm2, dword ptr [hit
+
eax] ;
movss xmm1, dword ptr [esi]
this
.lb.y ;
mulss xmm1, dword ptr [hit
+
ecx] ;
addss xmm2, xmm1 ;
movss xmm1, dword ptr [esi]
this
.lb.z ;
mulss xmm1, xmm5 ;
addss xmm2, xmm1 ;
//
if( bary.y < 0.0f || bary.y > dot_nd )
comiss xmm0, xmm2 ;
ja RETURN_FALSE ;
comiss xmm2, xmm5 ;
ja RETURN_FALSE ;
//
bary.z = dot_nd - bary.x - bary.y;
movaps xmm1, xmm5 ;
subss xmm1, xmm7 ;
subss xmm1, xmm2 ;
//
if( bary.z < 0.0f || bary.z > dot_nd )
comiss xmm0, xmm1 ;
ja RETURN_FALSE ;
comiss xmm1, xmm5 ;
ja RETURN_FALSE ;
movss dword ptr bary.x, xmm7 ;
movss dword ptr bary.y, xmm2 ;
movss dword ptr bary.z, xmm1 ;
}
//
__asm
查看全文
相关阅读:
“浪潮杯”第九届山东省ACM大学生程序设计竞赛 F: Four-tuples容斥定理
B
C. Tourist Problem 2021.3.29 晚vj拉题 cf 1600 纯数学题
C. Sum of Cubes
Day29、Python中的异常处理及元类
isinstance,issubclass,反射,内置方法(__str__,__del__,__call__)
绑定方法与非绑定方法;classmethod及staticmethod装饰器
组合,多态,封装
类的继承
面向对象编程思想基本介绍,类与对象的基本使用,属性查找,绑定方法
原文地址:https://www.cnblogs.com/len3d/p/818237.html
最新文章
weblogic的nohup.out日志,每天一个的解决方式
Windows系统
解决Invalid character found in the request target. The valid characters are defined in RFC 7230 and RF
Win2003下HP双网卡绑定后群集cluster配置修改过程5
惠普服务器双网卡绑定实现冗余
图解net use 命令使用示例
centOS 7下无法启动网络(service network start)错误解决办法(应该是最全的了。。。)
Linux虚拟机克隆后网卡UUID问题
开始我的博客园之旅
uboot源码分析2-启动第二阶段
热门文章
uboot源码分析1-启动第一阶段
uboot配置和编译过程详解
零距离初体验uboot
shell和Makefile
uboot前传
Codeforces Round #716 (Div. 2), problem: (B) AND 0, Sum Big位运算思维
Divide by Zero 2021 and Codeforces Round #714 (Div. 2) B. AND Sequences思维,位运算 难度1400
Codeforces Round #677 (Div. 3) D. Districts Connection思维1200
Codeforces Round #671 (Div. 2) B. Stairs 难度1200
“九韶杯”河科院程序设计协会第一届程序设计竞赛 D数列重组 next_permutation
Copyright © 2011-2022 走看看