我正试图改变起诉emscripten的小游戏。我设法编译它没有任何错误,但我在尝试编译/使用着色器时遇到以下错误 WebGL:INVALID_OPERATION:useProgram:程序无效 WebGL:INVALID_OPERATION:getAttribLocation:程序未链接
这是着色器代码
顶点:
attribute vec3 vertexPosition_modelspace;
attribute vec2 vertexUV;
varying vec2 UV;
varying float alfa;
uniform mat4 Proj;
void main()
{
UV = vertexUV;
alfa = vertexPosition_modelspace.z;
gl_Position = Proj * vec4(vertexPosition_modelspace, 1.0);
}
片段
varying vec2 UV;
varying float alfa;
uniform sampler2D myTextureSampler;
void main()
{
gl_FragColor = texture2D( myTextureSampler, UV );
gl_FragColor.a =gl_FragColor.a* alfa;
}
有任何帮助吗? 谢谢。
答案 0 :(得分:2)
我认为你错过了
precision mediump float;
位于片段着色器的顶部。 OpenGL ES 2.0(以及WebGL)要求您在片段着色器中指定精度。
理想情况下,您的原始C / C ++程序会检查错误并打印出错误,因为浏览器可能会告诉您该问题。您可以选择将linkProgram
和compileShader
包裹起来,如
gl = canvas.getContext("experimental-webgl");
oldLinkProgram = gl.linkProgram;
gl.linkProgram = function() {
// call the original linkProgram
oldLinkProgram.apply(gl, arguments);
var program = arguments[0];
// Check the link status
var linked = gl.getProgramParameter(program, gl.LINK_STATUS);
if (!linked) {
console.error("ERROR !!!! linking program: " + gl.getProgramInfoLog(program));
}
};
oldCompileShader = gl.compileShader;
gl.compileShader = function() {
// call the original compileShader
oldCompileShader.apply(gl, arguments);
var shader = arguments[0];
// Check the compile status
var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
if (!compiled) {
console.error("ERROR !!!! compiling program: " + gl.getShaderInfoLog(shader));
}
};
然后检查浏览器的控制台是否有错误。