pra*_*del 3 shader opengl-es glsl webgl webgl2
我的片段着色器中有一个制服,当我尝试获取制服位置的值时,它返回 null。
我检查了拼写,没有发现任何拼写错误,并且这个制服也用在着色器代码中。
我的错误是:
getUniformLocation([object WebGLProgram],materialAmbient)中的错误:WebGLProgram(“未命名”)中不存在统一的“materialAmbient”
这是我在 WebGL 中获取统一位置的代码。
let materialAmbientLocation = gl.getUniformLocation(programScene,"materialAmbient");
let materialDiffuseLocation = gl.getUniformLocation(programScene,"materialDiffuse");
let materialSpecularLocation = gl.getUniformLocation(programScene,"materialSpecular");
let shininessLocation = gl.getUniformLocation(programScene, "shininess");
let ambiemtLightLocation = gl.getUniformLocation(programScene, "ambientLight");
let diffuseLightLocation = gl.getUniformLocation(programScene, "diffuseLight");
let specularLightLocation = gl.getUniformLocation(programScene,"specularLight");
Run Code Online (Sandbox Code Playgroud)
我的片段着色器:
我的GLSL
const fsSkybox = `#version 300 es
precision highp float;
in vec3 texPosition;
in vec3 v_normal;
in vec3 f_position;
out vec4 outColor;
// uniform samplerCube u_SkyTexture;
uniform vec3 materialAmbient;
uniform vec3 emission;
uniform vec3 materialDiffuse;
uniform vec3 materialSpecular;
uniform float shininess;
uniform vec3 lightDirection;
uniform vec3 cameraPosition;
uniform vec3 ambientLight;
uniform vec3 diffuseLight;
uniform vec3 specularLight;
void main(){
vec3 f_normal = normalize(v_normal);
vec3 effectiveAmbient = ambientLight*materialAmbient;
vec3 f_lightDirection = normalize(lightDirection);
float lambertCofficient = max(dot(f_lightDirection, f_normal), 0.0);
vec3 effectiveDiffuse = lambertCofficient*materialDiffuse*diffuseLight;
vec3 surfacetoView = normalize(cameraPosition - f_position);
vec3 halfVector = lightDirection + surfacetoView;
float specular = dot(halfVector, f_normal);
vec3 effectiveSpecular = materialSpecular*pow(specular, shininess);
outColor = vec4(emission + effectiveDiffuse + effectiveSpecular, 1.0);
// outColor = texture(u_SkyTexture, texPosition);
// outColor = vec4(0.0, 1.0, 0.0, 1.0);
}
`;
Run Code Online (Sandbox Code Playgroud)
制服materialAmbient、ambientLight和specularLight不在着色器程序中“使用”。它们不需要计算输出outColor(实际上materialAmbient是ambientLight用来计算effectiveAmbient. effectiveAmbient,但是没有使用)。
编译器和链接器优化程序并删除不必要的计算和不必要的变量。因此,该变量不再是活动的程序资源,并且您无法获取该变量的资源索引(统一位置)。
| 归档时间: |
|
| 查看次数: |
1037 次 |
| 最近记录: |