Проекция текстуры в GLSL - PullRequest
3 голосов
/ 08 марта 2011

Я пытаюсь реализовать текстурную проекцию, основанную непосредственно на этом примере на oZone3d .Моя среда OpenGL ES 2.0 на Android 2.2.

Математическая математика никогда не была моей сильной стороной, и я подозреваю, что моя проблема лежит где-то в настройке матрицы проекции текстуры (texGenMatrix).Я перепробовал все мыслимые вещи, чтобы заставить это работать, но проекция не получается правильно.Я был бы очень признателен за дополнительный взгляд на мой код.Благодарю.

Здесь не показана моя геометрия (горизонтальная плоскость, проходящая через начало координат), а также некоторые другие сантехнические линии, например шейдерная форма / атрибуты.

Настройка камеры:

// Set the camera projection matrix 
Matrix.frustumM(cameraProjMatrix, 0, 
    -nearPlaneSize.x, nearPlaneSize.x,  // near plane left/right
    -nearPlaneSize.y, nearPlaneSize.y,  // near plane bottom/top
    nearPlaneDistance, farPlaneDistance // near/far plane distance
);

// Set the camera view matrix
Matrix.setLookAtM(cameraViewMatrix, 0, 
    0, 100, 100,  // eye
    0, 0, 0,  // center
    0, 1, 0 // up-vector
);

// Translate the model as needed
Matrix.translateM(modelMatrix, 0, x, y, z);

// Calculate the model * view matrix
Matrix.multiplyMM(modelViewMatrix, 0, cameraViewMatrix, 0, modelMatrix, 0);

// Calculate the inverse camera view matrix (needed in the vert shader)
Matrix.invertM(inverseCameraViewMatrix, 0, cameraViewMatrix, 0);

Настройка текстурной проекции:

// Set a texture projection matrix
Matrix.frustumM(texProjMatrix, 0, 
    -nearPlaneSize.x, nearPlaneSize.x,  // near plane left/right
    -nearPlaneSize.y, nearPlaneSize.y,  // near plane bottom/top
    nearPlaneDistance, farPlaneDistance // near/far plane distance
);


// Set the texture projection to point down at the origin
Matrix.setLookAtM(texViewMatrix, 0, 
    0, 100, 10,  // eye
    0, 0, 0,  // center
    0, 1, 0 // up-vector
);

 // scale bias
float[] scaleBiasMatrix = new float[] { 0.5f, 0.0f, 0.0f, 0.0f,
                                       0.0f, 0.5f, 0.0f, 0.0f,
                                       0.0f, 0.0f, 0.5f, 0.0f,
                                       0.5f, 0.5f, 0.5f, 1.0f
};

// calculate the TexGenMatrix 
Matrix.multiplyMM(texGenMatrix, 0, scaleBiasMatrix, 0, texProjMatrix, 0);
Matrix.multiplyMM(texGenMatrix, 0, texGenMatrix, 0, texViewMatrix, 0);

Вершинный шейдер:

attribute vec3 aPosition; // vertex x y z 

uniform mat4 texGenMatrix;
uniform mat4 modelViewMatrix;
uniform mat4 cameraProjMatrix;

varying vec4 vProjCoord;

void main() {
    gl_Position = cameraProjMatrix * modelViewMatrix * aPosition;
    vec4 posEye = modelViewMatrix * aPosition;
    vec4 posWorld = inverseCameraViewMatrix * posEye;
    vProjCoord = texGenMatrix * posWorld;
}

Фрагментный шейдер:

uniform sampler2D projectionMap;     
varying vec4 vProjCoord;

void main() {
    vec3 finalColor = vec3( 0.5, 0.5, 0.5);
    if (vProjCoord.q > 0.0) {
        vec4 ProjMapColor = texture2DProj(projectionMap, vProjCoord);
        finalColor += ProjMapColor.rgb;
    }
    gl_FragColor = vec4(finalColor, 1.0);
}
...