Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 如何在着色器中更改正交矩阵大小_Opengl_Matrix_Glsl_Glm Math_Projection Matrix - Fatal编程技术网

Opengl 如何在着色器中更改正交矩阵大小

Opengl 如何在着色器中更改正交矩阵大小,opengl,matrix,glsl,glm-math,projection-matrix,Opengl,Matrix,Glsl,Glm Math,Projection Matrix,我尝试缩放正交投影矩阵,但它似乎无法缩放其尺寸。我正在使用正交投影进行定向照明。但是如果主摄像机在地面上,我想使我的正交矩阵范围更大 例如,如果摄影机为零,则orho矩阵为 glm::正交(-10.0f,10.0f,-10.0f,10.0f,0.01f,4000.0f) 但如果相机在y方向移动400,我希望这个矩阵是这样的 glm::正交(-410.0f,410.0f,-410.0f,410.0f,0.01f,4000.0f) 但是我想用矩阵乘法或加法在着色器中实现这一点,矩阵可以通过以下方式计

我尝试缩放正交投影矩阵,但它似乎无法缩放其尺寸。我正在使用正交投影进行定向照明。但是如果主摄像机在地面上,我想使我的正交矩阵范围更大

例如,如果摄影机为零,则orho矩阵为
glm::正交(-10.0f,10.0f,-10.0f,10.0f,0.01f,4000.0f)

但如果相机在y方向移动400,我希望这个矩阵是这样的
glm::正交(-410.0f,410.0f,-410.0f,410.0f,0.01f,4000.0f)

但是我想用矩阵乘法或加法在着色器中实现这一点,矩阵可以通过以下方式计算:

r = right, l = left, b = bottom, t = top, n = near, f = far

X:    2/(r-l)         0               0               0
y:    0               2/(t-b)         0               0
z:    0               0               -2/(f-n)        0
t:    -(r+l)/(r-l)    -(t+b)/(t-b)    -(f+n)/(f-n)    1
例如,在glsl中:

float l=-410.0f;
浮子r=410.0f;
浮动b=-410.0f;
浮子t=410.0f;
浮子n=0.01f;
浮球f=4000.0f;
mat4投影=mat4(
vec4(2.0/(r-l),0.0,0.0,0.0),
vec4(0.0,2.0/(t-b),0.0,0.0),
vec4(0.0,0.0,-2.0/(f-n),0.0),
vec4(-(r+l)/(r-l),-(t+b)/(t-b),-(f+n)/(f-n),1.0)
);

此外,还可以缩放正交投影矩阵:

c++

glm::mat4正交=glm::正交(-10.0f,10.0f,-10.0f,10.0f,0.01f,4000.0f);
浮子刻度=10.0f/410.0f;
glm::mat4 scale_mat=glm::scale(glm::mat4(1.0f),glm::vec3(scale,scale,1.0f));
glm::mat4 ortho_new=ortho*scale_mat;
glsl

float scale=10.0/410.0;
mat4刻度\u mat=mat4(
vec4(标度,0.0,0.0,0.0),
vec4(0.0,刻度,0.0,0.0),
vec4(0.0,0.0,1.0,0.0),
vec4(0.0,0.0,0.0,1.0)
);
mat4 ortho_new=ortho*比例_mat;

谢谢。有没有其他的解决办法,比如用另一个矩阵相乘?@aramok我扩展了答案。