gpt4 book ai didi

javascript - WebGL 着色器创建问题

转载 作者:行者123 更新时间:2023-11-30 07:29:10 24 4
gpt4 key购买 nike

我正在尝试使用 WebGl 和 JavaScript 制作一个简单的应用程序,在学习我在互联网上找到的一些教程时,我在创建一些基本着色器时遇到了一个奇怪的问题。创建着色器程序的函数如下所示:

 this.CreateShaderProgram = function(vertexShader, fragmentShader)
{
var tmp = this.gl.createProgram();

var tempVert = this.gl.createShader(this.gl.VERTEX_SHADER);
this.gl.shaderSource(tempVert, vertexShader);
this.gl.compileShader(tempVert);
if(!this.gl.getShaderParameter(tempVert, this.gl.COMPILE_STATUS)) {
this.Log("invalid shader : " + vertexShader);
return null;
};

var tempFrag = this.gl.createShader(this.gl.FRAGMENT_SHADER);
this.gl.shaderSource(tempFrag, fragmentShader);
this.gl.compileShader(tempFrag);
if(!this.gl.getShaderParameter(tempFrag, this.gl.COMPILE_STATUS)) {
this.Log("invalid shader : " + fragmentShader);
return null;
};

this.gl.attachShader(tmp, tempVert);
this.gl.attachShader(tmp, tempFrag);

return tmp;
}

2 个着色器看起来像:

  attribute vec3 aVertexPosition;
uniform mat4 uMVMatrix;
uniform mat4 uPMatrix;
void main(void) {
gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
}
--------------------------------------------

#ifdef GL_ES precision highp float;
#endif
void main(void) {
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); };

奇怪的是,第一个顶点着色器编译成功,但对于片段着色器,它在“this.gl.compileShader(tempFrag);”上崩溃了。行,我不明白为什么。

最佳答案

您代码中的这段代码:

#ifdef GL_ES  precision highp float;
#endif

应该在不同的行上:

#ifdef GL_ES
precision highp float;
#endif

这是因为着色语言使用预处理器,很像 C Preprocessor .以 # 开头的行是预处理器指令,跨越整行。而 precision 语句不是;这只是 GLSL 中的一个普通语句。将它们放在同一行会使预处理器感到困惑,因为它将精度语句视为其指令的一部分。

Zecc 关于使用 getShaderInfoLog 的建议对于调试此类问题也是非常宝贵的。

关于javascript - WebGL 着色器创建问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4296520/

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