WebGL:INVALID_VALUE:附加着色器:没有对象或删除对象.这是秘密有帮助的吗
WebGL: INVALID_VALUE: attachShader: no object or object deleted. Is this secretly helpful?
我开始进入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没有。 不过也不能初始化着色器
我建议使用一些样板代码来编译着色器和链接程序
对于着色器
/**
* 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 控制台。它还应该为您提供堆栈跟踪,以便您可以知道问题在代码中的位置。
相关文章:
- 在不知道深度或父属性的情况下从对象中删除属性
- 解析JSON并从中删除对象会出错
- 如何从对象中删除属性
- 在特定条件下从存储在localStorage中的阵列中删除对象
- Es6:能够在设置/更新/删除对象属性时调用自定义方法
- AngularJS:删除重复的对象并按值对数组进行重新排序
- 正在从对象中删除值
- 正在从列表中删除对象
- 删除对象时终止setInterval
- jQuery-检测选择对象是否添加或删除了选项
- 如何在不删除类似侦听器的情况下从父对象中删除jQuery事件侦听器
- 为什么没有从数组中存在的对象中删除属性
- 从Three.js场景中删除许多对象的速度较慢
- 删除两个独立对象中的属性,而不使用多余的删除语句
- JS:将 EventListener 添加到动态创建的 DOM 对象中,这些对象删除 parentNode
- Java 脚本 json 解析对象:删除操作后不删除“,”
- JavaScript对象删除特定键值中的引号
- tinyMCE对象删除事件触发器
- javascript地图对象删除不工作
- Javascript对象删除元素