gpt4 book ai didi

javascript - WebGL:INVALID_VALUE:attachShader:没有对象或对象被删除。这暗地里有帮助吗?

转载 作者:行者123 更新时间:2023-11-30 10:34:52 25 4
gpt4 key购买 nike

我开始接触 WebGL,我想知道是否有一个了解错误输出的好地方。

我不断收到以下错误

WebGL: INVALID_VALUE: attachShader: no object or object deleted localhost:1   
WebGL: INVALID_OPERATION: getAttribLocation: program not linked localhost:1
WebGL: INVALID_OPERATION: getUniformLocation: program not linked localhost:1
WebGL: INVALID_OPERATION: useProgram: program not valid localhost:1
WebGL: INVALID_OPERATION: drawElements: attribs not setup correctly

因此,我可以从这些错误中看出我的着色器无法正常工作

gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);

随后的错误是关于没有程序。

所以我的问题是:如何找出我的代码中出了什么问题?

程序没有以某种方式定义,我确实有 var program = gl.createProgram();。那么,为什么会这样呢?我看哪里?我猜这是因为我的着色器无法编译,但据我所知,我的着色器有 0 个错误或警告。它被上述代码/警告混淆了......此外,chrome 提到了这些警告,而 firefox 没有。虽然两者都不能初始化着色器

最佳答案

我会建议 using some boilerplate code编译你的着色器和链接程序

对于着色器

/**
* Creates and compiles a shader.
*
* @param {!WebGLRenderingContext} gl The WebGL Context.
* @param {string} shaderSource The GLSL source code for the shader.
* @param {number} shaderType The type of shader, VERTEX_SHADER or
* FRAGMENT_SHADER.
* @return {!WebGLShader} The shader.
*/
function compileShader(gl, shaderSource, shaderType) {
// Create the shader object
var shader = gl.createShader(shaderType);

// Set the shader source code.
gl.shaderSource(shader, shaderSource);

// Compile the shader
gl.compileShader(shader);

// Check if it compiled
var success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
if (!success) {
// Something went wrong during compilation; get the error
throw "could not compile shader:" + gl.getShaderInfoLog(shader);
}

return shader;
}

对于程序

/**
* Creates a program from 2 shaders.
*
* @param {!WebGLRenderingContext) gl The WebGL context.
* @param {!WebGLShader} vertexShader A vertex shader.
* @param {!WebGLShader} fragmentShader A fragment shader.
* @return {!WebGLProgram} A program.
*/
function createProgram(gl, vertexShader, fragmentShader) {
// create a program.
var program = gl.createProgram();

// attach the shaders.
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);

// link the program.
gl.linkProgram(program);

// Check if it linked.
var success = gl.getProgramParameter(program, gl.LINK_STATUS);
if (!success) {
// something went wrong with the link
throw ("program filed to link:" + gl.getProgramInfoLog (program));
}

return program;
}

你可以这样调用它

var vertShader = compileShader(gl, vertShaderSource, gl.VERTEX_SHADER);
var fragShader = compileShader(gl, fragShaderSource, gl.FRAGMENT_SHADER);
var program = createProgram(gl, vertShader, fragShader);

如果您的着色器没有编译或链接,那应该将错误打印到 javascript 控制台。它还应该为您提供堆栈跟踪,以便您可以判断问题出在代码中的哪个位置。

关于javascript - WebGL:INVALID_VALUE:attachShader:没有对象或对象被删除。这暗地里有帮助吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14641618/

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