- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经学习了许多法线贴图的在线教程,并且在一定程度上让它发挥了作用......
除非多边形垂直于 View 向量,否则我似乎无法使其正常工作。
我创建了一个视频来说明这一点,因为图片并不足以表达我的意思。
http://www.youtube.com/watch?v=9D4o_zy-61s
我已经发布了我的着色器:
顶点:
#version 400
layout (location = 0) in vec3 attribPosition;
layout (location = 1) in vec3 attribNormal;
layout (location = 2) in vec2 attribTexCoord;
layout (location = 3) in vec3 attribTangent;
layout (location = 3) in vec3 attribBinormal;
uniform mat4 mvp;
uniform mat4 mvm;
uniform mat3 nm;
uniform vec3 lightPos_World;
out vec2 vUvs;
out vec3 lightPos_Eye;
out vec3 vertexPos_Eye;
out vec3 normalDir_Eye;
out vec3 normalDir_World;
out mat3 tbnMatrix;
void main()
{
vUvs = attribTexCoord;
normalDir_World = attribNormal;
normalDir_Eye = (nm * attribNormal);
vec3 t = nm * attribTangent;
vec3 n = nm * attribNormal;
vec3 b = nm * cross(n,t);
mat3 tbnMatrix = mat3(t.x, b.x, n.x,
t.y, b.y, n.y,
t.z, b.z, n.z);
vertexPos_Eye = (mvm * vec4(attribPosition,1.0)).xyz;
lightPos_Eye = (mvm * vec4(lightPos_World,1.0)).xyz;
gl_Position = mvp * vec4(attribPosition,1.0);
}
#version 400
layout( location = 0 ) out vec4 frag_main;
struct PointLight{
vec3 position;
vec3 ambient;
vec3 diffuse;
vec3 specular;
float shininess;
float intensity;
};
uniform PointLight light[2];
uniform sampler2D colorTexture;
uniform sampler2D normalTexture;
uniform mat4 mvm;
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// FLAGS - all flags start false;
// [0][0] = colour map
// [0][1] = normal map
// [0][2] = unused
// [0][3] = show normal map in colour channel
// [1][0] = use tangent space
// [1][1] = unused
// [1][2] = unused
// [1][3] = unused
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
uniform bvec4 flags[2];
in vec3 vertexPos_Eye;
in vec3 normalDir_World;
in vec3 normalDir_Eye;
in vec2 vUvs;
in mat3 tbnMatrix;
void main(){
uint numLights=2;
vec3 colorFragment;
if(flags[0][0]){
colorFragment = texture(colorTexture,vUvs).xyz;
}else{
colorFragment = vec3(0.5);
}
vec3 normalMapNormal = (texture(normalTexture,vUvs).rgb * 2) - 1;
vec3 normalDir;
if(flags[0][1]){
normalDir = normalize(normalDir_Eye);
}else{
normalDir = normalize(normalMapNormal.rgb);
}
vec4 outColor = vec4(1);
outColor.xyz = vec3(0);
float duller = 1/numLights;
for(int i = 0;i< numLights;i++){
vec3 lightPos_Eye = (mvm * vec4(light[i].position,1.0)).xyz;
vec3 lightDir_Eye = normalize(lightPos_Eye - vertexPos_Eye);
vec3 lightDir_Tangent = lightDir_Eye * tbnMatrix;
vec3 vertDir_Eye = normalize(-vertexPos_Eye);
vec3 vertDir_Tangent = vertDir_Eye * tbnMatrix;
vec3 halfDir_Eye = normalize(vertDir_Eye + lightDir_Eye);
vec3 halfDir_Tangent = halfDir_Eye * tbnMatrix;
vec3 Ia = colorFragment.xyz * light[i].ambient;
vec3 Id;
vec3 Is;
// tangent space
Id = (colorFragment.xyz * light[i].diffuse ) * max(dot(lightDir_Tangent, normalDir), 0);
Is = light[i].specular * pow(max(dot(halfDir_Eye, normalDir), 0), light[i].shininess*2);
// eye space
//Id = (colorFragment.xyz * light[i].diffuse ) * max(dot(lightDir_Eye, normalDir), 0);
//Is = light[i].specular * pow(max(dot(halfDir_Eye, normalDir), 0), light[i].shininess*2);
outColor.xyz += (Ia + Id + Is);
}
if(flags[0][3]){
outColor.xyz = normalDir;
}
frag_main = (outColor);
}
最佳答案
我注意到这一行:
vec3 b = nm * cross(n,t);
vec3 b = cross(n,t);
nm
再次,因为
n
和
t
位于所需的相机空间中。
lightPos_Eye = (mvm * vec4(lightPos_World,1.0)).xyz;
lightPos_World
在世界空间中(顾名思义),您应该将其乘以 *world_matrix* 之类的东西,而不是乘以模型 View 。或者只是计算
lightPos_Eye
在应用程序代码中并将其发送到顶点着色器。
关于opengl - 法线贴图问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15317646/
每当我尝试使用 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
我是一名优秀的程序员,十分优秀!