在OpenGL中,Normalize函数是由GLSL语言提供的一个内置函数。它的使用非常简单,只需将需要归一化的向量作为参数传入即可。Normalize函数会返回一个归一化后的向量。例如,如果我们有一个向量v,我们可以使用Normalize(v)来获得归一化后的向量。需要注意的是,如果向量的长度接近于0,Normalize函数可能会产生错误的结果,因
vec3 lightDir = normalize(lightPos - FragPos); vec3 viewDir = normalize(viewPos - FragPos); vec3 halfwayDir = normalize(lightDir + viewDir); 接下来,镜面光分量的实际计算只不过是对表面法线和半程向量进行一次约束点乘(Clamped Dot Product),让点乘结果不为负,从而获取它们之间夹角的余弦值,之后我...
初步思考片元着色器上的计算步骤: uniformsampler2DnormalMap;voidmain(){// 从法线贴图范围[0,1]获取法线信息(需要转换才能用)normal=texture(normalMap,fs_in.TexCoords).rgb;// 将法线向量转换回范围[-1,1] , RGB颜色变回法线向量 ,即可进行光照计算normal=normalize(normal*2.0-1.0);[...]// 正常计算...
float3 N = mul(worldMatrix_IT, posIn.objectNormal).xyz; N = normalize(N); //计算入射光方向\视线方向\半角向量 float3 L = normalize(lightPosition - worldPos); float3 V = normalize(eyePosition - worldPos); float3 H = normalize(L + V); // 计算漫反射分量 float3 diffuseColor = Kd ...
//计算镜面光照 vec3 viewDir = normalize(viewPos - vec3(fragPos)); //观察者方向 vec3 reflectDir = reflect(-lightDir, norm); //光照经法向量折射方向 float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32); //反光度,这里取点乘的32次幂 float specularStrength = 0.5; //镜面强度 ve...
第四个参数定义我们是否希望数据被标准化(Normalize)。如果我们设置为GL_TRUE,所有数据都会被映射到0(对于有符号型signed数据是-1)到1之间 第五个参数步长(Stride),它告诉我们在连续的顶点属性组之间的间隔 最后一个参数的类型是void*,数据在缓冲中起始位置的偏移量(Offset)*/glVertexAttribPointer(0,3, GL_FLOA...
(location=2)out vec4 gAlbedoSpec;invec2 TexCoords;invec3 FragPos;invec3 Normal;uniform sampler2D diffuse;uniform sampler2D specular;voidmain(){//保存位置信息gPosition=FragPos;//保存法线信息gNormal=normalize(Normal);//保存漫反射颜色信息,漫反射是物体的表面颜色gAlbedoSpec.rgb=texture(diffuse,...
vec3 normalized = normalize(color); floatvariance = (normalized.r - normalized.g) * (normalized.r - normalized.g); variance += (normalized.g - normalized.b) * (normalized.g - normalized.b); variance += (normalized.b - normalized.r) * (normalized.b - normalized.r); ...
s = normalize(vec3(Light.Direction)); else s = normalize(vec3(Light.Direction - position)); vec3 v = normalize(vec3(-position)); vec3 r = reflect(-s, norm); returnLight.Intensity * (Material.Ka Material.Kd*max(dot(s,norm), 0.0) ...
binormal=normalize(binormal); 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 法线,切线,副切线函数实现 Vector3Math::calculateTangentSpaceVector( constVector3&position1,constVector3&position2,constVector3&position3, ...