pje*_*cic 4 structure webgl vertex-shader
如何在顶点着色器中到达这种轻型结构?
struct LightInfo {
vec4 Position; // Light position in eye coords.
vec3 La; // Ambient light intensity
vec3 Ld; // Diffuse light intensity
vec3 Ls; // Specular light intensity
};
uniform LightInfo Light;
Run Code Online (Sandbox Code Playgroud)
我试过了:
shaderProgram.Light = gl.getUniformLocation(shaderProgram, "Light");
Run Code Online (Sandbox Code Playgroud)
编译,但当我尝试插入一些值,如:
gl.uniform4f(
shaderProgram.Light.Position,
parseFloat(document.getElementById("lightPositionX").value),
parseFloat(document.getElementById("lightPositionY").value),
parseFloat(document.getElementById("lightPositionZ").value),
0.0
);
Run Code Online (Sandbox Code Playgroud)
它完全打破了.如何将此位置数据发送到着色器结构?
您必须获得每种基本类型的位置.在你的例子中
struct LightInfo {
vec4 Position; // Light position in eye coords.
vec3 La; // Ambient light intensity
vec3 Ld; // Diffuse light intensity
vec3 Ls; // Specular light intensity
};
uniform LightInfo Light;
Run Code Online (Sandbox Code Playgroud)
意味着你需要
var lightPosLoc = gl.getUniformLocation(program, "Light.Position");
var lightLaLoc = gl.getUniformLocation(program, "Light.La");
var lightLdLoc = gl.getUniformLocation(program, "Light.Ld");
var lightLsLoc = gl.getUniformLocation(program, "Light.Ls");
Run Code Online (Sandbox Code Playgroud)
如果您有阵列,则需要为每个阵列的每个字段提供位置,如下所示
struct LightInfo {
vec4 Position; // Light position in eye coords.
vec3 La; // Ambient light intensity
vec3 Ld; // Diffuse light intensity
vec3 Ls; // Specular light intensity
};
uniform LightInfo Lights[2];
// ---
var light0PosLoc = gl.getUniformLocation(program, "Lights[0].Position");
var light0LaLoc = gl.getUniformLocation(program, "Lights[0].La");
var light0LdLoc = gl.getUniformLocation(program, "Lights[0].Ld");
var light0LsLoc = gl.getUniformLocation(program, "Lights[0].Ls");
var light1PosLoc = gl.getUniformLocation(program, "Lights[1].Position");
var light1LaLoc = gl.getUniformLocation(program, "Lights[1].La");
var light1LdLoc = gl.getUniformLocation(program, "Lights[1].Ld");
var light1LsLoc = gl.getUniformLocation(program, "Lights[1].Ls");
Run Code Online (Sandbox Code Playgroud)
和阵列数组等.
struct LightInfo {
vec4 Positions[2]; // Light positions in eye coords.
vec3 La; // Ambient light intensity
vec3 Ld; // Diffuse light intensity
vec3 Ls; // Specular light intensity
};
uniform LightInfo Lights[2];
// ---
var light0Pos0Loc = gl.getUniformLocation(program, "Lights[0].Positions[0]");
var light0Pos1Loc = gl.getUniformLocation(program, "Lights[0].Positions[1]");
var light0LaLoc = gl.getUniformLocation(program, "Lights[0].La");
var light0LdLoc = gl.getUniformLocation(program, "Lights[0].Ld");
var light0LsLoc = gl.getUniformLocation(program, "Lights[0].Ls");
var light1Pos0Loc = gl.getUniformLocation(program, "Lights[1].Positions[0]");
var light1Pos1Loc = gl.getUniformLocation(program, "Lights[1].Positions[1]");
var light1LaLoc = gl.getUniformLocation(program, "Lights[1].La");
var light1LdLoc = gl.getUniformLocation(program, "Lights[1].Ld");
var light1LsLoc = gl.getUniformLocation(program, "Lights[1].Ls");
Run Code Online (Sandbox Code Playgroud)
等等...