From 3012d7c8d202ccd750dae9bc98984d1743186ac5 Mon Sep 17 00:00:00 2001 From: xuchuanren Date: Tue, 28 May 2024 12:19:35 +0800 Subject: [PATCH] update OpenGL --- ...45\231\250\350\257\255\350\250\200GLSL.md" | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git "a/VideoDevelopment/OpenGL/7.OpenGL ES\347\235\200\350\211\262\345\231\250\350\257\255\350\250\200GLSL.md" "b/VideoDevelopment/OpenGL/7.OpenGL ES\347\235\200\350\211\262\345\231\250\350\257\255\350\250\200GLSL.md" index cac05def..8dbd031b 100644 --- "a/VideoDevelopment/OpenGL/7.OpenGL ES\347\235\200\350\211\262\345\231\250\350\257\255\350\250\200GLSL.md" +++ "b/VideoDevelopment/OpenGL/7.OpenGL ES\347\235\200\350\211\262\345\231\250\350\257\255\350\250\200GLSL.md" @@ -1,5 +1,16 @@ ## 7.OpenGL ES着色器语言GLSL +### 齐次坐标(Homogeneous coordinates) + +三维顶点视为三元组(x,y,z)。现在引入一个新的分量w,得到向量(x,y,z,w)。请先记住以下两点: + +若w==1,则向量(x, y, z, 1)为空间中的点。 +若w==0,则向量(x, y, z, 0)为方向。 + +齐次坐标使得我们可以用同一个公式对点和方向作运算。 + + + 着色器是使用一种叫GLSL的类C语言写成的。GLSL是为图形计算量身定制的,它包含一些针对向量和矩阵操作的有用特性。 着色器的开头总是要声明版本,接着是输入和输出变量、uniform和main函数。 @@ -315,6 +326,37 @@ mat3 myMat3 = mat3(1.0, 0.0, 0.0, // 第一列 ``` +三维图形学中我们只用到4x4矩阵,它能对顶点(x,y,z,w)作变换。这一变换是用矩阵左乘顶点来实现的: + +矩阵x顶点(记住顺序!!矩阵左乘顶点,顶点用列向量表示)= 变换后的顶点 + +![image](https://github.com/CharonChui/Pictures/blob/master/MatrixXVect.gif?raw=true) + +这看上去复杂,实则不然。左手指着a,右手指着x,得到ax。 左手移向右边一个数b,右手移向下一个数y,得到by。依次类推,得到cz、dw。最后求和ax + by + cz + dw,就得到了新的x!每一行都这么算下去,就得到了新的(x, y, z, w)向量。 + + +这种重复无聊的计算就让计算机代劳吧。 + +用C++,GLM表示: +```c++ +glm::mat4 myMatrix; +glm::vec4 myVector; +// fill myMatrix and myVector somehow +glm::vec4 transformedVector = myMatrix * myVector; // Again, in this order ! this is important. +``` + +用GLSL表示: + +```glsl +mat4 myMatrix; +vec4 myVector; +// fill myMatrix and myVector somehow +vec4 transformedVector = myMatrix * myVector; // Yeah, it's pretty much the same than GLM +``` + + + + - 采样器 采样器是专门用来对纹理进行采样工作的,在GLSL中一般来说,一个采样器变量表示一副或者一套纹理贴图。所谓的纹理贴图可以理解为我们看到的物体上的皮肤。