2012-11-20 6 views
3

버텍스 쉐이더에서이 라이트 구조체에 어떻게 접근 할 수 있습니까?WebGl의 코드에서 버텍스 쉐이더의 구조체에 액세스하기

shaderProgram.Light = gl.getUniformLocation(shaderProgram, "Light"); 

컴파일하지만 내가 좋아하는 몇 가지 값을 삽입하려고 할 때 :

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; 

나는 시도

gl.uniform4f(
    shaderProgram.Light.Position, 
    parseFloat(document.getElementById("lightPositionX").value), 
    parseFloat(document.getElementById("lightPositionY").value), 
    parseFloat(document.getElementById("lightPositionZ").value), 
    0.0 
); 

그것은 완전히 파괴. 이 위치 데이터를 셰이더 구조로 어떻게 보내겠습니까?

답변

8

는 각 기본 유형의 위치를 ​​받아야합니다. 당신의 예에서

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; 

는 배열이있는 경우 당신은 당신이

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"); 

의 각 배열의 각 필드의 위치를 ​​필요할 것

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"); 

필요 의미 등을 배열의 배열

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"); 

등 ...

+0

가능한 가장 좋은 설명입니다. 고맙습니다. – pjercic

관련 문제