使用 ShaderMaterial 复制 MeshLambertMaterial 会忽略纹理

2024-01-13

我注意到 THREE.js 在内部使用着色器来创建核心材质“例如 MeshLambertMaterial”,因此我决定将 Three.js 代码中的兰伯特着色器复制到新的着色器中并在其上进行构建。

这是我得到的代码(忠实地从 Three.js r66 复制)

THREE.MyShader = {

uniforms: THREE.UniformsUtils.merge( [
    THREE.UniformsLib[ "common" ],
    THREE.UniformsLib[ "fog" ],
    THREE.UniformsLib[ "lights" ],
    THREE.UniformsLib[ "shadowmap" ],
    {
        "ambient"  : { type: "c", value: new THREE.Color( 0xffffff ) },
        "emissive" : { type: "c", value: new THREE.Color( 0x000000 ) },
        "wrapRGB"  : { type: "v3", value: new THREE.Vector3( 1, 1, 1 ) }
    }
]),

vertexShader: [

    "#define LAMBERT",

    "varying vec3 vLightFront;",

    "#ifdef DOUBLE_SIDED",

        "varying vec3 vLightBack;",

    "#endif",

    THREE.ShaderChunk[ "map_pars_vertex" ],
    THREE.ShaderChunk[ "lightmap_pars_vertex" ],
    THREE.ShaderChunk[ "envmap_pars_vertex" ],
    THREE.ShaderChunk[ "lights_lambert_pars_vertex" ],
    THREE.ShaderChunk[ "color_pars_vertex" ],
    THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
    THREE.ShaderChunk[ "skinning_pars_vertex" ],
    THREE.ShaderChunk[ "shadowmap_pars_vertex" ],

    "void main() {",

        THREE.ShaderChunk[ "map_vertex" ],
        THREE.ShaderChunk[ "lightmap_vertex" ],
        THREE.ShaderChunk[ "color_vertex" ],

        THREE.ShaderChunk[ "morphnormal_vertex" ],
        THREE.ShaderChunk[ "skinbase_vertex" ],
        THREE.ShaderChunk[ "skinnormal_vertex" ],
        THREE.ShaderChunk[ "defaultnormal_vertex" ],

        THREE.ShaderChunk[ "morphtarget_vertex" ],
        THREE.ShaderChunk[ "skinning_vertex" ],
        THREE.ShaderChunk[ "default_vertex" ],

        THREE.ShaderChunk[ "worldpos_vertex" ],
        THREE.ShaderChunk[ "envmap_vertex" ],
        THREE.ShaderChunk[ "lights_lambert_vertex" ],
        THREE.ShaderChunk[ "shadowmap_vertex" ],

    "}"

].join("\n"),

fragmentShader: [

    "uniform float opacity;",

    "varying vec3 vLightFront;",

    "#ifdef DOUBLE_SIDED",

        "varying vec3 vLightBack;",

    "#endif",

    THREE.ShaderChunk[ "color_pars_fragment" ],
    THREE.ShaderChunk[ "map_pars_fragment" ],
    THREE.ShaderChunk[ "lightmap_pars_fragment" ],
    THREE.ShaderChunk[ "envmap_pars_fragment" ],
    THREE.ShaderChunk[ "fog_pars_fragment" ],
    THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
    THREE.ShaderChunk[ "specularmap_pars_fragment" ],



    "void main() {",

        "gl_FragColor = vec4( vec3 ( 1.0 ), opacity );",

        THREE.ShaderChunk[ "map_fragment" ],
        THREE.ShaderChunk[ "alphatest_fragment" ],
        THREE.ShaderChunk[ "specularmap_fragment" ],

        "#ifdef DOUBLE_SIDED",

            //"float isFront = float( gl_FrontFacing );",
            //"gl_FragColor.xyz *= isFront * vLightFront + ( 1.0 - isFront ) * vLightBack;",

            "if ( gl_FrontFacing )",
                "gl_FragColor.xyz *= vLightFront;",
            "else",
                "gl_FragColor.xyz *= vLightBack;",

        "#else",

            "gl_FragColor.xyz *= vLightFront;",

        "#endif",

        THREE.ShaderChunk[ "lightmap_fragment" ],
        THREE.ShaderChunk[ "color_fragment" ],
        THREE.ShaderChunk[ "envmap_fragment" ],
        THREE.ShaderChunk[ "shadowmap_fragment" ],

        THREE.ShaderChunk[ "linear_to_gamma_fragment" ],

        THREE.ShaderChunk[ "fog_fragment" ],

    "}"

].join("\n")

}

这是我用来设置制服和创建材质的代码。

var textureUsed = 'rock_1';
var texture = THREE.ImageUtils.loadTexture( texturePath + textureUsed + "/diffuse.png");
texture.wrapS   = THREE.RepeatWrapping;
texture.wrapT   = THREE.RepeatWrapping;
texture.repeat.x = 128;
texture.repeat.y = 128;
var shaderUniforms = THREE.UniformsUtils.clone( THREE.MyShader.uniforms );
shaderUniforms[ "map" ].value = texture;
var material =  new THREE.ShaderMaterial({
                    name: "TerrainShader",
                    uniforms    : shaderUniforms,
                    vertexShader: THREE.MyShader.vertexShader,
                    fragmentShader: THREE.MyShader.fragmentShader,
                    fog:false,
                    lights:true
                });

问题是,当我使用这些参数创建 MeshLambertMaterial 时,我得到了正确的照明和纹理重复,当我使用它创建 ShaderMaterial 时,灯光和阴影似乎正在工作,但纹理贴图未加载,要解决此问题,我深入研究代码并设法通过在材质定义之后将这个丑陋的“黑客”添加到我的代码中来加载地图

material.map = true;

现在纹理已加载并显示,但看起来纹理坐标被搞乱了,着色器似乎忽略了我提供的重复值,而不是重复。

为什么我需要这个技巧来处理我的纹理以及我可以做什么来获得正确的纹理重复?


Three.js 被设计为易于使用,而不是易于修改。这在未来可能会改变......

您需要设置material.defines像这样:

var defines = {};

defines[ "USE_MAP" ] = "";. 

然后指定defines在材质构造函数中。

var material =  new THREE.ShaderMaterial({
   name: "TerrainShader",
   defines     : defines,
   uniforms    : shaderUniforms,
   vertexShader: THREE.MyShader.vertexShader,
   fragmentShader: THREE.MyShader.fragmentShader,
   fog:false,
   lights:true
});

关于纹理重复,您需要将重复添加到您的制服中:

shaderUniforms[ "offsetRepeat" ].value.set( 0, 0, 2, 2 );

三.js r.66

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ShaderMaterial 复制 MeshLambertMaterial 会忽略纹理 的相关文章

  • 带换行符的 React/Momentjs 日期格式

    我有一个日期字符串 我想对其进行格式化 其中数字位于月份下 Jul 6 我尝试了几种不同的方法来添加新行
  • 为什么我的反应路由器链接将我带到页面中间?

    我的网站上有很多链接 但只有一个可以执行此操作 它没有将我带到导航栏的顶部 而是转到内容的中间 知道为什么会这样吗 这是一个页面 其中有一个 map经历一些JSON 这是渲染div页面下方的文本元素 如果重要的话 这是一些可能相关的代码 路
  • axios 请求中未发送正文数据

    我试图通过 axios 请求将数据发送到我的后端脚本 但正文看起来是空的 这是前端发送的请求 axios request method GET url http localhost 4444 next api headers Authori
  • MailTo 从 Javascript

    我有一个链接按钮 用于从页面内容构建邮件 从 javascript 启动它而不打开空白窗口或干扰调用它的窗口的最佳方法是什么 function Email var sMailTo mailto var sBody var alSelecte
  • Angular UI select:从远程服务获取数据

    我正在使用角度用户界面选择 https github com angular ui ui select https github com angular ui ui select 我查看了演示的可用位置这个笨蛋 http plnkr co
  • 如果没有“new”,则无法调用类构造函数

    感谢这个问题已经被问过几次了 但是我遇到的几乎所有情况都是有人试图扩展非本地类的情况 我的情况有所不同 我有一个非常简单的基类 名为CObject如下 export class CObject extends BaseObject cons
  • 如何判断一个网页是否支持jquery?

    确定网页是否启用 jquery 的最佳方法是什么 如果这是确定它的最佳方法 则使用 jquery 本身 if jQuery jquery object exists jQuery 并不神奇 它本质上只是一个大对象 您可以像检查任何其他对象一
  • 如何让Gmail像加载进度条一样

    我想在页面的中心和顶部创建一个像 Gmail 一样的加载进度条 并适用于所有浏览器 这是基本代码
  • 在 R 传单中添加不透明度滑块

    如何在 R leaflet 应用程序中添加滑块来控制特定图层的不透明度 对于这个应用程序 我不想使用闪亮 这里建议 在 R 传单应用程序中添加滑块 https stackoverflow com questions 37682619 add
  • Android 纹理仅显示纯色

    我正在尝试在四边形上显示单个纹理 我有一个可用的 VertexObject 它可以很好地绘制一个正方形 或任何几何对象 现在我尝试扩展它来处理纹理 但纹理不起作用 我只看到一种纯色的四边形 坐标数据位于 arrayList 中 the ve
  • JavaScript 将键添加到数组中的每个值

    我下面有这个数组 它由一个简单的数组组成 我想要完成的是放一把钥匙id在每个数组值前面以实现类似的效果 id a id b id c id d 有没有一种简单的方法可以做到这一点 任何帮助将不胜感激 谢谢 var test a b c d
  • 为什么我收到“在嵌套函数中通过 this 对类字段进行潜在无效的引用访问”错误

    在普通 JS 中 我的代码可以正常工作 对于这种情况 我想组件化我的Wall类应该在浏览器中显示用户上传的图像 同样 这在 vanilla JS 中正常工作 但在 JSX 中不起作用 我得到了一个potentially invalid re
  • 模板中带有 ng-if 的 angularjs 指令

    我正在构建一个在模板内使用 ng if 的指令 奇怪的是 提供给链接函数的元素没有扩展ng if代码 它只是ng if的注释行 经过一番尝试 我发现通过将链接代码包装在 timeout 中似乎可以使其正常工作 但我想知道这是否不是正确的处理
  • Web组件中嵌套槽的内容不可见

    我有一个 Web 组件 它应该接受任意元素来包装其内容 虽然我可以在 Chrome 开发工具中看到插槽已正确分配 但 DOM 中什么也没有出现 以前有人见过这个问题吗 定义 class ExampleParent extends HTMLE
  • javascript 是否有等效的 __repr__ ?

    我最接近Python的东西repr这是 function User name password this name name this password password User prototype toString function r
  • 我可以使用 ASP.NET WebForms 母版页在每个内容页中包含不同的 javascript/css 文件吗?

    我有几个使用相同母版页的内容页 它们并不都需要包含在相同的 javascript 和 css 文件中 tag 是否可以更改内容来自内容页面的标签 确实如此 但我建议采取一些不同的做法 我在关闭正文标签的正上方放置了一个内容占位符 然后我填充
  • 使用 ref 触发反应 dropzone 不起作用

    我正在实现这个库 https github com felixrieseberg React Dropzone Component https github com felixrieseberg React Dropzone Compone
  • ThreeJS 中阴影的奇怪行为

    所以我有一个 ThreeJS 场景 并且添加了一些球体 多材质 我还添加了定向光 this light new THREE DirectionalLight 0xFFFFFF 1 this light position set 2 10 2
  • 确定 Javascript 中的日期相等性

    我需要找出用户在 Javascript 中选择的两个日期是否相同 日期以字符串 xx xx xxxx 形式传递给该函数 这就是我需要的全部粒度 这是我的代码 var valid true var d1 new Date datein val
  • 根据 GLSL 中向量的特定分量执行最小-最大的最快方法?

    我需要在我的 GLSL 代码中多次调用这种函数 vec2 minx vec2 a vec2 b if a x lt b x return a else return b 我担心过度分支 有没有办法避免 if else 结构 我建议使用 GL

随机推荐

  • 如何使用 Translate Toolkit 将 .po 转换为 PHP 数组(Zend Framework)?

    我正在尝试使用po2php http docs translatehouse org projects translate toolkit en latest commands php2po html将我的 po 文件转换为 Zend ph
  • Docusign:使用 REST API 和预填充标签通过模板创建信封

    我正在集成 Docusign 以便收件人可以看到他们的信封嵌入在我的网站上 我首先使用 api 创建信封 然后尝试使用动态数据预填充数据字段 据我所知 我用来创建信封的 json 没有任何问题 StackOverflow 上针对此问题的其他
  • 有没有办法将 QWidget 添加到 QtCreator 中的 QMenu

    我正在创建一个文本编辑器 我想把QComboBox in the QMenu 我在里面没有找到任何方法QMenu处理过这样的事情 最接近的是QMenu addAction 我想知道如何绕过这个障碍 Thanks 你必须子类化QWidgetA
  • 高斯模糊和卷积核

    我不明白什么是卷积核以及如何将卷积矩阵应用于图像中的像素 我说的是对图像进行高斯模糊操作 我还可以获得有关如何为高斯模糊操作创建内核的解释吗 我在读本文 http en wikipedia org wiki Gaussian blur但我似
  • 点击视口底部时阻止 Mobile Safari 显示工具栏

    我们有一个简单的移动应用程序在 iOS 上的 Mobile Safari MS 中运行 当用户向下滚动页面时n像素 一个 顶部 按钮从底部向上滑动 顶部按钮是固定位置 问题是 当您开始在 MS 中滚动时 导航和工具栏 UI 会被隐藏 当您点
  • 无法使用 servlet 和 jsp 更新表中的特定记录

    大家好 我为用户创建了一个 jsp 页面 他们可以在其中更新其现有详细信息 并且提交时记录会在数据库中更新 1 gt 帐户详细信息 java Java Servlet program responsible for obtaining th
  • Github:带有拉取请求的分叉

    我正在研究这段代码 https github com samvermette SVPullToRefresh https github com samvermette SVPullToRefresh 这有许多拉取请求待处理 但由于某种原因
  • 模拟子进程.Popen

    我有一个模块 utils py 它有这个 run cmd 方法 def run cmd cmd pipe subprocess Popen cmd shell True stdout subprocess PIPE stderr subpr
  • Linq 不同 - 计数

    我希望对示例对象列表执行查询 Date Username 01 01 2011 james 01 01 2011 jamie 01 01 2011 alex 01 01 2011 james 02 01 2011 matt 02 01 20
  • Friendly_id使用belongs_to关联中的值

    我有以下型号 class User lt ActiveRecord Base extend FriendlyId friendly id first name use gt slugged has one professor after c
  • C# 线程安全快速计数器

    在 C 中获得具有最佳性能的线程安全计数器的方法是什么 这很简单 public static long GetNextValue long result lock LOCK result COUNTER return result 但还有更
  • iOS14.2中的SwiftUI PageTabView会多次调用ChildView的onAppear方法

    我使用 TabView PageTabViewStyle 和 SwiftUI 来显示页面视图 当我滑动这个 TabView 时 我发现子视图会多次调用 onAppear 方法 有人可以告诉我为什么吗 这是我的代码 import SwiftU
  • 基于 C 有符号整数的攻击

    我正在读书这个问题 https stackoverflow com questions 21217126 memcpy implementation strict aliasing以及提到的评论之一基于 C 有符号整数的攻击 我知道什么是i
  • 如何在 std::set 中选择随机元素?

    如何在数组中选择一个随机元素std set 我天真地尝试过这个 int GetSample const std set
  • FFMPEG 到 YouTube 直播

    我有一个音频流 我使用 ffmpeg 将其流式传输到 youtube live 并使用以下命令将图像作为背景 ffmpeg loop 1 i x jpg i http xxx xxx xxx xxxx 5305 stream c a aac
  • 将 Pandas 数据框插入 Cassandra 表

    来自文档 https datastax github io python driver getting started html 有一种方法可以将数据插入表中 session execute INSERT INTO users name c
  • String_agg 用于多列

    我有以下选择 repairs DB select DB raw select r id repair id w name w surname from repairs r join repair worker rw on r id rw r
  • 当连接中断时,读取 urllib2 生成的流永远不会恢复

    在尝试使我的一个 Python 应用程序在连接中断时更加健壮时 我发现调用 urllib2 生成的 http 流的读取函数可能会永远阻止脚本 我认为读取函数会超时并最终引发异常 但当连接在读取函数调用期间中断时 情况并非如此 这是会导致问题
  • Firefox Addon 中的 OnBeforeRequest URL 重定向(从 Chrome 扩展转换)

    我想将我的 Chrome 扩展程序转换为 Firefox 到目前为止一切顺利 除了我有一个网址重定向webRequest onBeforeRequest在 Chrome 扩展程序中 这是Firefox WebExtensions 中不允许
  • 使用 ShaderMaterial 复制 MeshLambertMaterial 会忽略纹理

    我注意到 THREE js 在内部使用着色器来创建核心材质 例如 MeshLambertMaterial 因此我决定将 Three js 代码中的兰伯特着色器复制到新的着色器中并在其上进行构建 这是我得到的代码 忠实地从 Three js