- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我从切线空间法线贴图着色器中得到了一些非常奇特的结果:)。在这里显示的场景中,茶壶和方格墙正在使用我的普通Phong-Blinn着色器进行着色(显然,茶壶背面剔除器使它具有短暂的外观:-)。我尝试将法线贴图添加到球体中,并产生迷幻效果:
光线从右侧发出(几乎可见为黑色 Blob )。我在球体上使用的法线贴图如下所示:
我正在使用AssImp处理输入模型,因此它会自动为我计算每个顶点的切线和双法线。
像素和顶点着色器在下面。我不太确定出了什么问题,但是如果正切基矩阵某种程度上出了错,也不会令我感到惊讶。我假设我必须将事物计算到眼睛空间中,然后将眼睛和光向量转换为切线空间,这是解决该问题的正确方法。请注意,光源位置已进入 View 空间中的着色器。
// Vertex Shader
#version 420
// Uniform Buffer Structures
// Camera.
layout (std140) uniform Camera
{
mat4 Camera_Projection;
mat4 Camera_View;
};
// Matrices per model.
layout (std140) uniform Model
{
mat4 Model_ViewModelSpace;
mat4 Model_ViewModelSpaceInverseTranspose;
};
// Spotlight.
layout (std140) uniform OmniLight
{
float Light_Intensity;
vec3 Light_Position; // Already in view space.
vec4 Light_Ambient_Colour;
vec4 Light_Diffuse_Colour;
vec4 Light_Specular_Colour;
};
// Streams (per vertex)
layout(location = 0) in vec3 attrib_Position;
layout(location = 1) in vec3 attrib_Normal;
layout(location = 2) in vec3 attrib_Tangent;
layout(location = 3) in vec3 attrib_BiNormal;
layout(location = 4) in vec2 attrib_Texture;
// Output streams (per vertex)
out vec3 attrib_Fragment_Normal;
out vec4 attrib_Fragment_Position;
out vec3 attrib_Fragment_Light;
out vec3 attrib_Fragment_Eye;
// Shared.
out vec2 varying_TextureCoord;
// Main
void main()
{
// Compute normal.
attrib_Fragment_Normal = (Model_ViewModelSpaceInverseTranspose * vec4(attrib_Normal, 0.0)).xyz;
// Compute position.
vec4 position = Model_ViewModelSpace * vec4(attrib_Position, 1.0);
// Generate matrix for tangent basis.
mat3 tangentBasis = mat3( attrib_Tangent,
attrib_BiNormal,
attrib_Normal);
// Light vector.
attrib_Fragment_Light = tangentBasis * normalize(Light_Position - position.xyz);
// Eye vector.
attrib_Fragment_Eye = tangentBasis * normalize(-position.xyz);
// Return position.
gl_Position = Camera_Projection * position;
}
// Pixel Shader
#version 420
// Samplers
uniform sampler2D Map_Normal;
// Global Uniforms
// Material.
layout (std140) uniform Material
{
vec4 Material_Ambient_Colour;
vec4 Material_Diffuse_Colour;
vec4 Material_Specular_Colour;
vec4 Material_Emissive_Colour;
float Material_Shininess;
float Material_Strength;
};
// Spotlight.
layout (std140) uniform OmniLight
{
float Light_Intensity;
vec3 Light_Position;
vec4 Light_Ambient_Colour;
vec4 Light_Diffuse_Colour;
vec4 Light_Specular_Colour;
};
// Input streams (per vertex)
in vec3 attrib_Fragment_Normal;
in vec3 attrib_Fragment_Position;
in vec3 attrib_Fragment_Light;
in vec3 attrib_Fragment_Eye;
// Shared.
in vec2 varying_TextureCoord;
// Result
out vec4 Out_Colour;
// Main
void main(void)
{
// Compute normals.
vec3 N = normalize(texture(Map_Normal, varying_TextureCoord).xyz * 2.0 - 1.0);
vec3 L = normalize(attrib_Fragment_Light);
vec3 V = normalize(attrib_Fragment_Eye);
vec3 R = normalize(-reflect(L, N));
// Compute products.
float NdotL = max(0.0, dot(N, L));
float RdotV = max(0.0, dot(R, V));
// Compute final colours.
vec4 ambient = Light_Ambient_Colour * Material_Ambient_Colour;
vec4 diffuse = Light_Diffuse_Colour * Material_Diffuse_Colour * NdotL;
vec4 specular = Light_Specular_Colour * Material_Specular_Colour * (pow(RdotV, Material_Shininess) * Material_Strength);
// Final colour.
Out_Colour = ambient + diffuse + specular;
}
最佳答案
我认为您的着色器还可以,但是您在球体上的纹理坐标完全不可用。好像它们在经度上向两极扭曲。
关于opengl - 切线空间法线贴图-着色器完整性检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10031591/
许多贴图技术包括法线凹凸贴图、视差贴图和其他需要特殊的每顶点切线空间基础(切线、法线、副法线/双切线)。 这显然意味着我的模型不仅应该导出 顶点位置 , 纹理坐标和 近似每顶点法线 ,但也是切线空间基
如何绕过函数tan(x)未定义的角度,即x != Pi/2 + k * PI ? 我尝试使用条件: (x != 0) && (2 * x / M_PI - (int)(2 * x / M_PI ) )
我想绘制一个简单的图示,说明如何使用导数找出函数在任意点的斜率。它看起来有点像这样: 我已经使用这段代码绘制了一个简单的抛物线: import numpy as np from matplotlib
给定两个函数,我想找出两条曲线的公切线: 公切线的斜率可以通过以下方式获得: slope of common tangent = (f(x1) - g(x2)) / (x1 - x2) = f'(x1
我知道 tan(angle) 让我得到切线。但是,如何进行“反向切线”,以便在给定直角三角形两边长度的情况下得到角度? 我假设在 math.h 中有一个方法? 最佳答案 正如其他人所提到的,atan(
我是一名优秀的程序员,十分优秀!