- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在世界空间坐标中实现法线/凹凸贴图(我发现它们更容易使用)并且我的照明在没有法线贴图的情况下也能正常工作,但是当引入法线贴图(以及使用 TBN 矩阵计算的新 vector )时我的照明的镜面反射组件已关闭。
镜面反射分量不在相机和灯光之间,所以有些地方是错误的。但是,查看我的代码我找不到任何问题。切线和双切线来自 ASSIMP 对象加载器,eyePos 和 lightPos 也在世界坐标中。
由于光照在镜面反射部分看起来是正确的(显示了凹凸贴图),我认为它与切线空间变换有关?
这是一张展示问题的图片:
顶点着色器:
#version 330
layout (location = 0) in vec4 vertex;
layout(location = 1) in vec3 normal;
layout(location = 2) in vec3 tangent;
layout(location = 3) in vec3 bitangent;
layout(location = 5) in vec2 texCoord;
uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;
uniform vec3 lightPos;
uniform vec3 eyePos;
out vec3 Position;
out vec2 TexCoord;
out vec3 tangentLightDir;
out vec3 tangentViewDir;
void main()
{
gl_Position = projection * view * model * vertex;
// Position
Position = vec3(model * vertex);
// Normal
mat3 normalMat = transpose(inverse(mat3(model)));
Normal = normalize(normalMat * normal);
// Texture
TexCoord = texCoord;
// Normal mapping
mat3 TBN = mat3(tangent, bitangent, Normal);
TBN = transpose(TBN);
// Get direction vectors:
vec3 lightDir = normalize(lightPos - Position);
vec3 viewDir = normalize(eyePos - Position);
// Now transform them to tangent space
tangentLightDir = TBN * lightDir;
tangentViewDir = TBN * viewDir;
}
片段着色器:
#version 330
in vec3 Position;
in vec2 TexCoord;
in vec3 tangentLightDir;
in vec3 tangentViewDir;
uniform sampler2D texture0;
uniform sampler2D texture_normal;
out vec4 outColor;
void main()
{
// defaults
vec4 ambient = vec4(0.1);
vec4 diffuse = vec4(0.4);
vec4 specular = vec4(0.5);
vec4 texColor = texture(texture0, TexCoord);
// Phong shading
vec3 LightDir = normalize(tangentLightDir);
vec3 Norm = normalize(texture(texture_normal, TexCoord).xyz * 2.0 - 1.0);
vec3 ViewDir = normalize(tangentViewDir);
vec3 ReflectDir = reflect(-LightDir,Norm);
float specularContribution = pow(max(dot(ViewDir, ReflectDir), 0.0), 32);
// Calculate diffuse component
vec4 I = diffuse * max(dot(LightDir, Norm), 0.0);
diffuse = clamp(I, 0.0, 1.0);
// Calculate specular component
specular = specular * specularContribution;
outColor = texColor * (diffuse + specular + ambient);
}
最佳答案
layout(location = 3) in vec3 bitangent;
layout(location = 5) in vec2 texCoord;
5 是正确的位置吗?
关于 TBN 矩阵。你必须(怎么说 jhoffman0x )将 normalMat 矩阵乘以 tangent 和 bitangent,归一化结果,然后 make TBN矩阵:
示例来自 David Wolff - OpenGL 4.0 Shading Language Cookbook .顶点着色器:
#version 430
layout (location = 0) in vec3 VertexPosition;
layout (location = 1) in vec3 VertexNormal;
layout (location = 2) in vec2 VertexTexCoord;
layout (location = 3) in vec4 VertexTangent;
struct LightInfo {
vec4 Position; // Light position in eye coords.
vec3 Intensity; // A,D,S intensity
};
uniform LightInfo Light;
out vec3 LightDir;
out vec2 TexCoord;
out vec3 ViewDir;
uniform mat4 ModelViewMatrix;
uniform mat3 NormalMatrix;
uniform mat4 ProjectionMatrix;
uniform mat4 MVP;
void main()
{
// Transform normal and tangent to eye space
vec3 norm = normalize( NormalMatrix * VertexNormal );
vec3 tang = normalize( NormalMatrix * vec3(VertexTangent) );
// Compute the binormal
vec3 binormal = normalize( cross( norm, tang ) ) * VertexTangent.w;
// Matrix for transformation to tangent space
mat3 toObjectLocal = mat3(
tang.x, binormal.x, norm.x,
tang.y, binormal.y, norm.y,
tang.z, binormal.z, norm.z ) ;
// Transform light direction and view direction to tangent space
vec3 pos = vec3( ModelViewMatrix * vec4(VertexPosition,1.0) );
LightDir = normalize( toObjectLocal * (Light.Position.xyz - pos) );
ViewDir = toObjectLocal * normalize(-pos);
TexCoord = VertexTexCoord;
gl_Position = MVP * vec4(VertexPosition,1.0);
}
片段着色器:
#version 430
in vec3 LightDir;
in vec2 TexCoord;
in vec3 ViewDir;
layout(binding=0) uniform sampler2D ColorTex;
layout(binding=1) uniform sampler2D NormalMapTex;
struct LightInfo {
vec4 Position; // Light position in eye coords.
vec3 Intensity; // A,D,S intensity
};
uniform LightInfo Light;
struct MaterialInfo {
vec3 Ka; // Ambient reflectivity
vec3 Ks; // Specular reflectivity
float Shininess; // Specular shininess factor
};
uniform MaterialInfo Material;
layout( location = 0 ) out vec4 FragColor;
vec3 phongModel( vec3 norm, vec3 diffR ) {
vec3 r = reflect( -LightDir, norm );
vec3 ambient = Light.Intensity * Material.Ka;
float sDotN = max( dot(LightDir, norm), 0.0 );
vec3 diffuse = Light.Intensity * diffR * sDotN;
vec3 spec = vec3(0.0);
if( sDotN > 0.0 )
spec = Light.Intensity * Material.Ks *
pow( max( dot(r,ViewDir), 0.0 ), Material.Shininess );
return ambient + diffuse + spec;
}
void main() {
// Lookup the normal from the normal map
vec4 normal = 2.0 * texture( NormalMapTex, TexCoord ) - 1.0;
vec4 texColor = texture( ColorTex, TexCoord );
FragColor = vec4( phongModel(normal.xyz, texColor.rgb), 1.0 );
}
关于c++ - 镜面反射分量不正确的法线贴图和 phong 着色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21994094/
每当我尝试使用 AndroidStudio 生成一个新的 Android 项目时,它总是隐藏文件夹“drawables”。这以前从未发生在我身上。我环顾四周,发现它生成了这个名为“mipmap”的文件
因此,我试图使 native map 在EXPO应用程序中工作,文档页面显示“在EXPO应用程序中无需使用设置” https://docs.expo.io/versions/latest/sdk/ma
摘要 我正在尝试将位移贴图(高度贴图)应用于一个相当简单的对象(六角形平面),并且得到了一些意想不到的结果。我使用的是灰度,因此,我的印象是我的高度图应该只影响网格的 Z 值。然而,我创建的置换贴图在
我目前正在对three.js 进行一些试验,我想使用自发光贴图。我曾尝试将纹理加载到 phong Material 的自发光属性中,但不幸的是,它并没有像那样工作。这是我的代码: var params
我是地理编码方面的新手,所以我希望你能给我一些提示,告诉我如何获得以下内容: 我想用 D3 或传单制作一张 map ,上面有一些标记。如果单击标记,信息应弹出/显示在 map 旁边。有点像这个例子:h
我正在使用jvector maps客户网站上的 map ,他们知道希望我将其转换为 Concrete5,以便他们可以自行编辑。一切都很顺利,直到我尝试重新创建我使用 jVector map 的页面。当
这会导致疯狂的编译时间:~20 秒。请注意,它创建了 global-s9e3ed7fd2e.png 图像 5 次,而不是移动设备一次和桌面一次。 我只看到 @import "sprites/globa
我想创建一个 STL map 来查找一个项目是否足够接近 3 维空间中的另一个项目。到目前为止,我的“less-than-functor”工作得很好,粘贴到以下链接。 现在这个问题不完全是“最近邻”问
在初始化 map 时直接给出标记和多边形似乎可以工作,但是在调用 setState 方法时不会添加多边形和标记。 我不知道我似乎错过了什么, 以下是我迄今为止尝试过的。 有人可以帮助解决我所缺少的 m
我想弄清楚如何在盒子的正面和背面使用两种不同的纹理。每当我缩放我的盒子 (ExtrudeGeometry) 时,UV 贴图似乎都没有更新。因此,我为盒子的正面和背面定义了自己的 UV 贴图。 要定义我
我正在尝试正确映射 UV 纹理,但失败了... 我的应用程序中有下一个结果: 结果不是我在等待。我想要下一个描述的 View : 源代码在这里: http://pastebin.com/aDg981B
我正在尝试创建一个 Material 对话框以使用 AGM( Angular 谷歌地图)捕获用户位置。我的主页上有一个工作示例,但是当对话框打开时,它只会在 map 应该显示的位置显示一个空白区域。当
尝试将 UV 坐标映射到球体时遇到以下问题 这是我用来获取 UV 坐标的代码 glm::vec2 calcUV( glm::vec3 p) { p = glm::normalize(p);
我需要找到一种方法来解决在不使用设计工具的情况下为非凸多面体生成纹理贴图的问题。具体来说,我将模拟结果数据映射到 3D 表面上。也就是说,在代码中(最好是 C# 或 VB,因为我的目标是 WPF 3D
尝试添加 infoWindows 时,我收到 Unable to get gMarker frommarkerScope! (在 Angular map 中: https://github.com/a
这是一个非常简单的 Three.JS 草图,生成以下渲染: 正如您可能看到的,这个 THREE.BufferGeometry 是一个 8x8 矩阵,通过以这种方式设置 UV: for(var i =
我在使用 UV 贴图渲染 3D 对象时遇到问题。 首先,我的对象在 Wavefront 模型中。我使用一个解析器将整个文件拆分为顶点、法线、面和纹理坐标。解析 file.obj 后,我拥有了所有这些。
在 RStudio 中使用传单会在查看器中生成空白 map 。只能看到标记。在控制台中看不到任何警告或错误消息。当我使用 shiny 时,它在 RStudio 查看器中是一样的,但可以通过在 shin
在互联网上多次搜索后我找不到答案.. 情况如何?我是(比利时)大学计算机科学专业的学生,我必须使用图形库 LibGdx 用 Java 制作塔防。 问题是什么?在LibGdx中,有一个名为“Ti
如何将多个参数传递给通过 pool.map 调用的函数? 我的代码: import gevent from gevent.pool import Pool def process(param1, pa
我是一名优秀的程序员,十分优秀!