一丶题目:简述四元数的作用,四元数对欧拉角的优点?
答案:四元数用于表示旋转
A.四元数一般定义如下:q=w+xi+yj+zk 其中 w,x,y,z 是实数。同时,
有: i*i=-1 j*j=-1 k*k=-1
B.四元数也可以表示为: q=[w,v]
有多种方式可表示旋转,如 axis/angle、欧拉角(Euler angles)、矩阵
(matrix)、四元组等。 相对于其它方法,四元组有其本身的优点:
a.四元数不会有欧拉角存在的 gimbal lock 问题[万向节死锁]
b.四元数由 4 个数组成,旋转矩阵需要 9 个数
c.两个四元数之间更容易插值
d.四元数、矩阵在多次运算后会积攒误差,需要分别对其做规范化
(normalize)和正交化 (orthogonalize),对四元数规范化更容易
e.与旋转矩阵类似,两个四元组相乘可表示两次旋转
...
公司出处: 上海悉梦计算机
二丶题目:向量的点乘、叉乘以及归一化的意义?
答案:
1)点乘描述了两个向量的相似程度,结果越大两向量越相似,还可表示投影
2)叉乘得到的向量垂直于原来的两个向量
3)标准化向量:用在只关系方向,不关心大小的时候
...
公司出处: 上海悉梦计算机
三丶题目:矩阵相乘的意义及注意点
答案:用于表示线性变换:旋转、缩放、投影、平移、仿射
注意矩阵的蠕变:误差的积累
...
公司出处: 上海悉梦计算机
四丶题目:alpha blend 工作原理
答案:实际显示颜色 = 前景颜色*Alpha/255 + 背景颜色*(255-Alpha)/255
...
公司出处: 上海悉梦计算机
五丶题目:写光照计算中的 diffuse 的计算公式
答案:实际光照强度 I= 环境光(Iambient) + 漫反射光(Idiffuse) + 镜面高光(Ispecular);
环境光:Iambient= Aintensity* Acolor; (Aintensity 表示环境光强度,Acolor 表示环境
光颜色)
漫反射光:Idiffuse = Dintensity*Dcolor*N.L;
(Dintensity 表示漫反射强度,Dcolor 表示漫反射光颜色,N 为该点的法向量,L 为光源向
量)
镜面反射光:Ispecular = Sintensity*Scolor*(R.V)^n;
(Sintensity 表示镜面光照强度,Scolor 表示镜面光颜色,R 为光的反射向量,V 为观察者
向量,n 称为镜面光指数)
...
公司出处: 上海悉梦计算机
六丶题目:两种阴影判断的方法工作原理
答案:阴影由两部分组成:本影与半影
本影:景物表面上那些没有被光源直接照射的区域(全黑的轮廓分明的区域)
半影:景物表面上那些被某些特定光源直接照射但并非被所有特定光源直接照射的区域(半
明半暗区域)
求阴影区域的方法:做两次消隐过程
一次对每个光源进行消隐,求出对于光源而言不可见的区域 L;
一次对视点的位置进行消隐,求出对于视点而言可见的面 S;
shadow area= L ∩ S
阴影分为两种:自身阴影和投射阴影
自身阴影:因物体自身的遮挡而使光线照射不到它上面的某些可见面
工作原理:利用背面剔除的方法求出,即假设视点在点光源的位置。
投射阴影: 因不透明物体遮挡光线使得场景中位于该物体后面的物体或区域受不到光照照射而形成的阴影
工作原理:从光源处向物体的所有可见面投射光线,将这些面投影到场景中得到投影面,再
将这些投影面与场景中的其他平面求交得出阴影多边形,保存这些阴影多边形信息,然后再
按视点位置对场景进行相应处理得到所要求的视图(利用空间换时间,每次只需依据视点位
置进行一次阴影计算即可,省去了一次消隐过程)若是动态光源此方法就无效了。
...
公司出处: 上海悉梦计算机
七丶题目:Vertex Shader 是什么?怎么计算?
答案:顶点着色器是一段执行在 GPU 上的程序,用来取代 fixed pipeline 中的 transformation和 lighting,Vertex Shader 主要操作顶点。
Vertex Shader 对输入顶点完成了从 local space 到 homogeneous space(齐次空间)的变换过程,homogeneous space 即 projection space 的下一个 space。在这其间共有 world
transformation, view transformation 和 projection transformation 及 lighting 几个过程。
...
公司出处: 上海悉梦计算机
八丶题目:什么是渲染管道?
答案:是指在显示器上为了显示出图像而经过的一系列必要操作。 渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去。主要步骤有:本地坐标->视图坐标->背面裁剪->光照->裁剪->投影->视图变换->光栅化。
...
公司出处: 上海悉梦计算机
九丶题目:怎么判断两个平面是否相交?不能用碰撞体,说出计算方法
答案:对于两个平面Ax+By+Cz+D=0与ax+by+cz+d=0,只要(A,B,C)与(a,b,c)不成比例,这两个平面就是相交的。
...
公司出处: 上海悉梦计算机
十丶题目:法线贴图 、CG 动画
答案:
A.法线贴图:是在原物体的凹凸表面的每个点上均作法线,通过 RGB 颜色通
道来标记法线的方向, 你可以把它理解成与原凹凸表面平行的另一个不同的表面,但实际上它又只是一个光滑的平面。
B.CG 动画:原为 Computer Graphics 的英文缩写。随着以计算机为主要工具进行视觉设计和生产的一系列相关产业的形成,国际上习惯将利用计算机技术进行视觉设计和生产的领域通称为 CG。它既包括技术也包括艺术,几乎囊括了当今电脑时代中所有的视觉艺术创作活动,如平面印刷品的设计、网页设计、三维动画、影视特效、多媒体技术、以计算机辅助设计为主的建筑设计及工业造型设计等。
...
公司出处: 上海悉梦计算机
十一丶题目:什么是局部坐标,什么是世界坐标?
答案:世界坐标是不会变的, 一直以世界坐标轴的 XYZ 为标准。 局部坐标其实就是自身的坐标,会随着物体的旋转而变化的。
...
公司出处: 上海悉梦计算机
十二丶题目:请描述 MeshRender 中 material 和 shader 的区别?
答案:Shader(着色器)实际上就是一小段程序,它负责将输入的 Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出。绘图单元可以依据这个输出来将图像绘制到屏幕上。输入的贴图或者颜色等,加上对应的 Shader,以及对 Shader 的特定的参数设置,将这些内容(Shader 及输入参数)打包存储在一起,得到的就是一个 Material(材质)Shader 大体上可以分为两类:表面着色器(Surface Shader) 、片段着色器(Fragment Shader
...
公司出处: 上海悉梦计算机
十三丶题目:什么是矢量图
答案:
矢量图:计算机中显示的图形一般可以分为两大类——矢量图和位图。矢量图使用直线和曲线来描述图形,这些图形的元素是一些点、线、矩形、多边形、圆和弧线等等,它们都是通过数学公式计算获得的。例如一幅花的矢量图形实际上是由线段形成外框轮廓, 由外框的颜色以及外框所封闭的颜色决定花显示出的颜色。由于矢量图形可通过公式计算获得,所以矢量图形文件体积一般较小。矢量图形最大的优点是无论放大、缩小或旋转等不会失真;最大的缺点是难以表现色彩层次丰富的逼真图像效果。
...
公司出处: 上海悉梦计算机
十四丶题目:四元组是什么?
答案:所谓四元数,就是把 4 个实数组合起来的东西。4 个元素中,一个是实部,其余 3 个是虚部。
...
公司出处: 上海悉梦计算机
十五丶题目:你对你的数学知识感觉如何?比如空间向量,图形学
答案:个人感觉还是不错的,空间向量和图形学之前有自学过。只是在实际工作中直接使用的机会比较少,底层的一些操作有些生疏了。
...
公司出处: 上海悉梦计算机
十六丶题目:会写shader么
答案:了解一些,但是写的不多
...
公司出处: 华锐视点
十七丶题目:3D基础相关
1. 2 1 0 1 0 1
1 0 1 × 0 0 0
2 1 1 1 1 1
上述两个矩阵相乘的结果
答案:
2 0 2
2 1 2
3 1 3
...
公司出处: 上海鹿游网络科技有限公司
十八丶题目:什么是投影矩阵
答案:投影矩阵是一个典型的缩放和透视矩阵。投影变换将视锥变换成一个直平行六面体的形状。因为视锥的近处比远处小,这样就会对靠近摄像机的对象起到放大的作用,也就将透视应用到了场景当中
...
公司出处: 上海鹿游网络科技有限公司
十九丶题目:什么是UV
答案:UV坐标是指所有的图象文件都是二维的一个平面。水平方向是U,垂直方向是V,通过这个平面的,二维的UV坐标系。我们可以定位图象上的任意一个象素。
...
公司出处: 上海鹿游网络科技有限公司
二十丶题目:Cullback,cullfront,culloff区别
答案:剔除背面、剔除前面、不剔除
...
公司出处: 上海鹿游网络科技有限公司
二十一丶题目:什么是顶点程序和片段程序
答案:顶点着色器是一组指令代码,这组指令代码在顶点被渲染时执行。
片段着色器也是在 GPU 上运行的小程序。它们负责输出每个呈现的三角形像素的最终像素颜色。基本而言,它的工作原理如下:片段着色器以输入的形式收到顶点着色器通过管道传递的所有这些片段。
...
公司出处: 上海鹿游网络科技有限公司
二十二丶题目:如何实现以下人物在树丛中部分透明效果?
答案:
Shader "Custom/PlayerDiffuse" {
Properties {
_NotVisibleColor ("NotVisibleColor (RGB)", Color) = (0.3,0.3,0.3,1)
_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader {
Tags { "Queue" = "Geometry+500" "RenderType"="Opaque" }
LOD 200
Pass {
ZTest Greater
Lighting Off
ZWrite Off
// Color [_NotVisibleColor]
Blend SrcAlpha OneMinusSrcAlpha
SetTexture [_MainTex] { ConstantColor [_NotVisibleColor] combine constant * texture }
}
Pass {
ZTest LEqual
Material {
Diffuse (1,1,1,1)
Ambient (1,1,1,1)
}
Lighting Off
SetTexture [_MainTex] { combine texture }
}
}
FallBack "Diffuse"
}
...
公司出处: 上海鹿游网络科技有限公司
二十三丶题目:简述lightmap的使用
答案:参看此页:http://blog.csdn.net/jbjwpzyl3611421/article/details/11050525
...
公司出处: 上海鹿游网络科技有限公司
二十四丶题目:Shader的代码实现?大概写一下
答案:
Shader "Custom/NewSurfaceShader" {
Properties {
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Metallic ("Metallic", Range(0,1)) = 0.0
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
// Physically based Standard lighting model, and enable shadows on all light types
#pragma surface surf Standard fullforwardshadows
// Use shader model 3.0 target, to get nicer looking lighting
#pragma target 3.0
sampler2D _MainTex;
struct Input {
float2 uv_MainTex;
};
half _Glossiness;
half _Metallic;
fixed4 _Color;
void surf (Input IN, inout SurfaceOutputStandard o) {
// Albedo comes from a texture tinted by color
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = c.rgb;
// Metallic and smoothness come from slider variables
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
...
公司出处: 上海鹿游网络科技有限公司
二十五丶题目:游戏中要怎么实现矩阵相乘?
答案:
//矩阵相乘
public static float[][] Mul(float[][] a, float[][] b) {
//确保矩阵a的列数和b的行数相等
if(a[0].length != b.length) {
return null;
}
//用来存放结果的矩阵,axb的结果为a的行数和b的列数
float[][] result = new float[a.length][b[0].length];
//对a的每行进行遍历
for(int i=0; i<a.length; i++) {
//对b的每列进行遍历
for(int j=0;j<b[0].length; j++) {
//c为每一个点的值
float c = 0;
//第i行j列的值为a的第i行上的n个数和b的第j列上的n个数对应相乘之和,其中n为a的列数,也是b的行数,a的列数和b的行数相等
for(int k=0; k<a[0].length; k++) {
c += (a[i][k]*b[k][j]);
}
result[i][j] = c;
}
}
return result;
}
...
公司出处: 上海鹿游网络科技有限公司
二十六丶逻辑题目:有4位好友,其中一个人干了一件好事,不留名,记者来查此事,问4位,他们的回答如下:
A:不是我
B.是C
C.是D
D.他胡说
已知3个人说真话,一个人说假话,现在根据以上信息找出做了好事的人(并编程实现)
答案:
1.假设A讲假话,其馀三人讲真话,则B和C出现矛盾,所以假设不成立,A讲真话.
2.假设B讲假话,其馀三人讲真话,则C和D的
说法出现矛盾,所以假设不成立,B讲真话.
3.假设C讲假话,其馀三人讲真话,则A、B、D的证供都成立,所以假设成立,C讲假话.
4.假设D讲假话,其馀三人讲真话,则B和C出现矛盾,所以假设不成立,D讲真话.
推出,C是做好事的人.
提示:
第一步:被测者从1—4
第二步:将被测者代入表达式
第三步:判断3个表达式为真吗?是的则打印结果程序结束。不是,判断是否全测完,不是转第一步,是打印未找到,程序结束。完成下面的程序。
# include <stdio.h>
main()
{int k=0,sum=0,g=0;
char man=' ';
for(k=1;k<=4&&g==10;k++)
{ man=64+k;
sum=(man!='A')+(man=='C')+ (men==’D’) + (men!=’D’);
if(sum==3)
{clrscr(); printf("\nman=%c\n",64+k);
g=1;}
}
if(g!=1) printf("can't found!");
getch();
}
...
公司出处: 心动网络