gpt4 book ai didi

three.js - 在 ThreeJS 中从外部文件加载着色器时出现问题

转载 作者:行者123 更新时间:2023-12-01 18:04:36 25 4
gpt4 key购买 nike

这个问题之前(2年前)已经在ThreeJS github和SO的几个地方被问过。但仍然有很多人(包括我)对此有疑问。这就是我现在得到的(这是一个更大系统的一部分):

function dataLoader()
{
this.data_count = 0;
this.data_array = new Array();
}

function loadFile( file, loader ){
var FileObject = new Object();
FileObject.data = "";
FileObject.ready = false;
FileObject.id = loader.data_count;
loader.data_array[loader.data_count] = false;
$.ajax({
type: "GET",
url: file,
dataType: "text"
}).done( function( msg ) {
FileObject.data = msg;
FileObject.ready = true;
loader.data_array[FileObject.id] = true;
});
loader.data_count += 1;
return FileObject;
}

然后我这样做:

var loader = new dataLoader();
var SkyVertexShader = loadFile( "Shaders/sky.frag", loader );
var SkyFragmentShader = loadFile( "Shaders/sky.vertex", loader );

然后我创建这样的 Material :

var skyMat = new THREE.ShaderMaterial( { vertexShader: SkyVertexShader.data, fragmentShader: SkyFragmentShader.data, uniforms: uniforms, side: THREE.BackSide } );

sky.frag 和 sky.vertex 中的着色器是纯文本,没有任何标签或任何内容。当我调试时,我可以看到 SkyFragmentShader.data 和 SkyVertexShader.data 均已正确设置。着色器来自 webgl_lights_hemisphere例子。但是当我加载时出现此错误:

ERROR: 0:37: 'modelMatrix' : undeclared identifier
ERROR: 0:37: 'position' : undeclared identifier
ERROR: 0:37: 'constructor' : not enough data provided for construction
ERROR: 0:38: 'assign' : l-value required "vWorldPosition" (can't modify a varying) ERROR: 0:40: 'gl_Position' : undeclared identifier
ERROR: 0:40: 'projectionMatrix' : undeclared identifier
ERROR: 0:40: 'modelViewMatrix' : undeclared identifier
ERROR: 0:40: 'constructor' : not enough data provided for construction
ERROR: 0:40: 'assign' : cannot convert from '4-component vector of float' to 'float' �

但是当我这样做时它就起作用了(就像示例中一样):

var fragmentShader = document.getElementById( 'fragmentShader' ).textContent;
var vertexShader = document.getElementById( 'vertexShader' ).textContent;
var skyMat = new THREE.ShaderMaterial( { vertexShader: vertexShader, fragmentShader: fragmentShader, uniforms: uniforms, side: THREE.BackSide } );

当然,最后一部分仅在使用 HTML 格式的着色器时才有效。因此,即使 .textContent 方法和 Ajax GET 方法之间的内容实际上相同(只是一些选项卡和换行符),它也会显示有关 undefined variable 的语法错误。那么什么可能导致这种情况呢?

最佳答案

好吧,我明白了。我以相反的顺序加载它们,这使得顶点着色器成为第一个,片段成为第二个。这使得 ThreeJS 在错误的位置添加了代码并引发了错误。遗憾的是,它让我调试了很长时间,因为这些错误似乎很常见,但可以通过 Firebug 获取完整生成的着色器文本,这很有帮助。但感谢 gaitat,它确实让我更仔细地了解了加载。

关于three.js - 在 ThreeJS 中从外部文件加载着色器时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15099868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com