纹理如何映射到 3D 对象?
How are textures mapped to 3D objects?
我目前正在学习 C++ 和 OpenGL,想知道下面的代码如何能够将纹理映射到场景中的 3D 对象。该代码目前有效,但我很难理解它。
//In the Pixel Shader.
float pi = 3.14159265359;
vec3 N = normalize (Normal);
vec3 L = normalize (vec3 (EyeSpaceLightPosition - EyeSpacePosition));
vec3 R = reflect (L, N);
vec3 V = normalize (vec3 (EyeSpacePosition) - vec3 (0, 0, 0));
//Specifically these parts here.
float theta = acos (dot ( N, L )) / pi;
float phi = acos (dot ( -R, V )) / pi;
fragColor = vec4 (texture (texture1, vec2 ( theta, phi )));
acos (dot ( N, L ))
获取向量 N
和 L
之间的角度,这将以弧度为单位,因此需要除以 pi
以获得范围 texture()
期望。
所有实际的纹理魔术都发生在这里
fragColor = vec4 (texture (texture1, vec2 ( theta, phi )));
texture()
将在其第二个参数和 return 定义的位置对第一个参数中的纹理进行采样,并将颜色值作为包含颜色分量(红色、绿色、蓝色和 alpha)的 vec4 .
我目前正在学习 C++ 和 OpenGL,想知道下面的代码如何能够将纹理映射到场景中的 3D 对象。该代码目前有效,但我很难理解它。
//In the Pixel Shader.
float pi = 3.14159265359;
vec3 N = normalize (Normal);
vec3 L = normalize (vec3 (EyeSpaceLightPosition - EyeSpacePosition));
vec3 R = reflect (L, N);
vec3 V = normalize (vec3 (EyeSpacePosition) - vec3 (0, 0, 0));
//Specifically these parts here.
float theta = acos (dot ( N, L )) / pi;
float phi = acos (dot ( -R, V )) / pi;
fragColor = vec4 (texture (texture1, vec2 ( theta, phi )));
acos (dot ( N, L ))
获取向量 N
和 L
之间的角度,这将以弧度为单位,因此需要除以 pi
以获得范围 texture()
期望。
所有实际的纹理魔术都发生在这里
fragColor = vec4 (texture (texture1, vec2 ( theta, phi )));
texture()
将在其第二个参数和 return 定义的位置对第一个参数中的纹理进行采样,并将颜色值作为包含颜色分量(红色、绿色、蓝色和 alpha)的 vec4 .