- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Three.js 中开发了一个带有纹理散布的地形生成系统,但我无法对其应用法线贴图。我该怎么办?此代码目前功能齐全。
我查看了一些 WebGL 着色和法线贴图的教程,但找不到适合我的代码的教程。
FRAGMENT_SHADER: `
uniform sampler2D albedoA;
uniform sampler2D albedoB;
uniform sampler2D albedoC;
uniform sampler2D albedoD;
uniform sampler2D albedoE;
uniform sampler2D normalA;
uniform sampler2D normalB;
uniform sampler2D normalC;
uniform sampler2D normalD;
uniform sampler2D normalE;
uniform float repeatScale;
uniform vec3 sunPosition;
varying vec2 vUV;
varying float vAmount;
varying vec3 vNormal;
varying vec3 vWorldPosition;
void main()
{
vec3 diffA = (smoothstep(0.01, 0.25, vAmount) - smoothstep(0.25, 0.35, vAmount)) * texture2D(albedoA, vUV * repeatScale).rgb;
vec3 diffB = (smoothstep(0.24, 0.27, vAmount) - smoothstep(0.27, 0.37, vAmount)) * texture2D(albedoB, vUV * repeatScale).rgb;
vec3 diffC = (smoothstep(0.28, 0.32, vAmount) - smoothstep(0.32, 0.42, vAmount)) * texture2D(albedoC, vUV * repeatScale).rgb;
vec3 diffD = (smoothstep(0.30, 0.60, vAmount) - smoothstep(0.40, 0.70, vAmount)) * texture2D(albedoD, vUV * repeatScale).rgb;
vec3 diffE = (smoothstep(0.50, 0.85, vAmount)) * texture2D(albedoE, vUV * repeatScale).rgb;
vec3 albedoVector = diffA + diffB + diffC + diffD + diffE;
vec3 normA = (smoothstep(0.01, 0.25, vAmount) - smoothstep(0.25, 0.35, vAmount)) * texture2D(normalA, vUV * repeatScale).rgb;
vec3 normB = (smoothstep(0.24, 0.27, vAmount) - smoothstep(0.27, 0.37, vAmount)) * texture2D(normalB, vUV * repeatScale).rgb;
vec3 normC = (smoothstep(0.28, 0.32, vAmount) - smoothstep(0.32, 0.42, vAmount)) * texture2D(normalC, vUV * repeatScale).rgb;
vec3 normD = (smoothstep(0.30, 0.60, vAmount) - smoothstep(0.40, 0.70, vAmount)) * texture2D(normalD, vUV * repeatScale).rgb;
vec3 normE = (smoothstep(0.50, 0.85, vAmount)) * texture2D(normalE, vUV * repeatScale).rgb;
vec3 normalVector = normA + normB + normC + normD + normE;
float diffuseFloat = max(dot(normalize(sunPosition - vWorldPosition), vNormal), 0.0);
if (diffuseFloat < 0.25) { diffuseFloat = 0.25; }
if (diffuseFloat > 1.0) { diffuseFloat = 1.0; }
gl_FragColor = vec4(diffuseFloat * albedoVector, 1.0);
}
`,
VERTEX_SHADER: `
uniform sampler2D heightTexture;
varying vec2 vUV;
varying float vAmount;
varying vec3 vNormal;
varying vec3 vWorldPosition;
void main()
{
vUV = uv;
vAmount = texture2D(heightTexture, uv).r;
vec4 worldPosition = modelViewMatrix * vec4(position, 1.0);
vWorldPosition = worldPosition.xyz;
vNormal = vec3(normal);
gl_Position = projectionMatrix * worldPosition;
}
`
我正在使用 THREE.ShaderMaterial,截至目前,代码会显示纹理并说明光照和阴影,但不会显示法线贴图。
最佳答案
您可以通过简单的数值近似计算表面(地形)的法线 - 请参阅 Finite difference method .
你必须知道高度图纹理的大小。我建议将纹理的大小设置为统一变量:
uniform sampler2D heightTexture;
uniform vec2 heightTextureSize; // (width, height) of heightTexture;
计算纹理相邻纹素之间的偏移量:
vec2 offset = 1.0 / heightTextureSize;
读取纹理相邻纹素的高度
vA = texture2D(heightTexture, uv).r;
vAL = texture2D(heightTexture, uv + vec2(-offset.x, 0.0)).r;
vAR = texture2D(heightTexture, uv + vec2( offset.x, 0.0)).r;
vAB = texture2D(heightTexture, uv + vec2( 0.0, -offset.y)).r;
vAT = texture2D(heightTexture, uv + vec2( 0.0, offset.y)).r;
最后可以计算纹理空间中的近似法向量
vec3 normalMap = normalize( vec3(vAL - vAR, vAT - vAB, 2.0) );
关于javascript - 纹理 Splatted Terrain 上的法线贴图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54013587/
如何覆盖解包语法*obj和**obj的结果? 例如,您能否以某种方式创建一个行为如下的对象 thing: >>> [*thing] ['a', 'b', 'c'] >>> [x for x in th
在 Python 中,可以使用 * 运算符来解包可迭代对象。 In [1]: head, *tail = [1, 2, 3, 4, 5] In [2]: head Out[2]: 1 In [3]:
我被要求调整我前一段时间正在处理的脚本。我得到了帮助here .在脚本中,我使用了 splatting 和格式运算符。它在脚本上进一步工作,但失败了。我打开了一个小得多的样本来显示失败。如果您需要查看
我大部分时间都在用这个。我试图在 splatting 之前向我的哈希表添加一个参数。但是,我尝试添加的参数是两个字符串的集合。 $myHT = @{ From = 'me@x.
F# 内置运算符/函数是否允许解包参数列表/元组并将其传递给函数调用? 用法示例: // simple add function let add (a1 : int) (a2 : int) (a3 :
我正在尝试使用 Start-Job 来启动一个新的 Powershell 脚本。新脚本有几个参数(有些是可选的,有些不是),所以我想制作一个哈希表并将它们拼凑起来。然而,这些参数之一本身就是一个哈希表
下面的 Split-Path 参数不正确,它应该是 $delZipExe。 这使得 $delZipCmd 哈希值被设置为空。 我希望 WorkingDirectory 值在 $delZipCmd 哈希
我试图解压一个列表: ls = [1, 2, 3] a, *b = ls 然后,我尝试解压字典: dc = {'x': 1, 'y': 2, 'z': 3} a, **b = dc # Out: Sy
我在一篇文章中看到了这方面的插图,但是当我在我的 IRB shell 中尝试它时,我得到了一个错误。以下代码合法吗?否则有没有一种简写的方法来获取中间数组(比如假定排序数组的 1 或 2 个元素的中值
对于下面的方法 def mixed_args(a,b,*c,d) puts a,b,c,d end p mixed_args(1,2,3,4,5) 我收到此错误消息: syntax error,
为什么这段代码 Hash[*[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten] 返回这个 {:first_name=>"Shane",
使用yield_self,一元方法的参数可以预先放置在方法链中。因此,给定: Foo = Struct.new(:one_arg) 这一行: Foo.new("x") 相当于那一行: "x".yiel
我是 Ruby 的新手,将构建国际象棋作为一种学习练习。我正在尝试重构一些代码,但遇到了困难。 为什么这样做: @available_moves = [] #part of castling logi
match, text, number = *"foobar 123".match(/([A-z]*) ([0-9]*)/) 我知道这是在做某种正则表达式匹配,但是 splat 在这里扮演什么角色,有
def initialize(apps, catch=404) @apps = []; @has_app = {} apps.each { |app| add app } @catch =
昨天有人问splat运算符,我想看源代码……是用C写的还是Ruby写的?在哪里可以找到? 最佳答案 一些快速的谷歌搜索显示它是在 eval.c 中实现的。 .您可以在文件中的几个地方找到对“splat
散列上的 splat 将其转换为数组。 [*{foo: :bar}] # => [[:foo, :bar]] 这里是否存在某种隐藏机制(例如隐式类转换),或者它是一种内置的原始特征? 除了数组,nil
我在浏览 Camping 代码库时看到一个带有 splat 的构造函数,如下所示: class Fruit def initialize(*) end end 我试着在这个网站和谷歌上查找“s
这是我的程序: def calculate(*numbers, options = {}) add(numbers) if options[:add] subtract(number
我定义了一个带有循环的模块: module "stamp" { for_each = toset(var.stamps) source = "./modules/stamp" ...
我是一名优秀的程序员,十分优秀!