OpenGL:glLoadMatrix和深度缓冲区

埃莱姆斯·格兰

另一个深度缓冲问题:

我有基于矩阵的相机-矩阵补偿在OpenGL端(glPushMatrix,旋转,从OpenGL获取矩阵,glPopMatrix),并且在更新相机时,我通过glLoadMatrix将这些计算出的矩阵内容发送到OpenGL。一切正常(移动和旋转),但深度缓冲区混乱了:

没有glLoadMatrix(没有移动/旋转):

我想要用相机

使用glLoadMatrix:

但我明白了

我不明白,为什么会发生这些事情(如果我通过“经典”三角函数移动相机,一切正常)。

public class Camera implements ICamera {
private final FloatBuffer matrix = BufferUtils.createFloatBuffer(16);

private final FloatBuffer buffer = BufferUtils.createFloatBuffer(16);

/**
 * absolutní pozice kamery v prostoru
 */
private final Vector3f position = new Vector3f();

/**
 * aktuální pohled kamery
 */
private final Vector3f look = new Vector3f();

/**
 * nastavení pozice kamery
 */
@Override
public void setPosition(Vector3f aPosition) {
    matrix.clear();
    matrix.put(0, 1.0f);
    matrix.put(5, 1.0f);
    matrix.put(10, -1.0f);
    matrix.put(15, 1.0f);
    matrix.put(12, aPosition.getX());
    matrix.put(13, aPosition.getY());
    matrix.put(14, aPosition.getZ());
    position.set(matrix.get(12), matrix.get(13), matrix.get(14));
}

/**
 * commonly called with move vector
 */
public void move(Vector3f aPosition) {
    matrix.clear();
    float x = aPosition.getX();
    float y = aPosition.getY();
    float z = aPosition.getZ();
    matrix.put(12, matrix.get(12) + x * matrix.get(0) + y * matrix.get(4) + z * matrix.get(8));
    matrix.put(13, matrix.get(13) + x * matrix.get(1) + y * matrix.get(5) + z * matrix.get(9));
    matrix.put(14, matrix.get(14) + x * matrix.get(2) + y * matrix.get(6) + z * matrix.get(10));
    position.set(matrix.get(12), matrix.get(13), matrix.get(14));
}

/**
 * nastaví směr pohledu na zadaný bod (slouží k otáčení kamery)
 */
public void look(Vector3f aTarget) {
    matrix.clear();
    // realne neovlivni scenu, pouze vyuziva OpenGL pro vypocty matic
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glLoadMatrix(matrix);
    glRotatef(aTarget.getY(), 1, 0, 0);
    glGetFloat(GL_MODELVIEW_MATRIX, matrix);
    glRotatef(-aTarget.getX(), matrix.get(1), matrix.get(5), matrix.get(9));
    glGetFloat(GL_MODELVIEW_MATRIX, matrix);
    glPopMatrix();
    /**
     * - není potřeba normalizovat, poněvadž v matici už normalizovaný je
     * - 12, 13, 14 je pozice kamery, 8, 9, 10 je rotace kamery; výsledek dá absolutní vektor pohledu kamery
     */
    look.set(matrix.get(12) - matrix.get(8), matrix.get(13) - matrix.get(9), matrix.get(14) - matrix.get(10));
}

// this thing update camera rotation/position
@Override
public void tick(float aTick) {
    // nevypada to hezky, nicmene usetri to nejmene 1 volani navic
    float m00 = matrix.get(0);
    float m01 = matrix.get(1);
    float m02 = matrix.get(2);
    float m04 = matrix.get(4);
    float m05 = matrix.get(5);
    float m06 = matrix.get(6);
    float m08 = matrix.get(8);
    float m09 = matrix.get(9);
    float m10 = matrix.get(10);
    float m12 = matrix.get(12);
    float m13 = matrix.get(13);
    float m14 = matrix.get(14);
    buffer.put(0, m00);
    buffer.put(1, m04);
    buffer.put(2, m08);
    buffer.put(4, m01);
    buffer.put(5, m05);
    buffer.put(6, m09);
    buffer.put(8, m02);
    buffer.put(9, m06);
    buffer.put(10, m10);
    buffer.put(12, -(m00 * m12 + m01 * m13 + m02 * m14));
    buffer.put(13, -(m04 * m12 + m05 * m13 + m06 * m14));
    buffer.put(14, -(m08 * m12 + m09 * m13 + m10 * m14));
    buffer.rewind();
    glMatrixMode(GL_MODELVIEW);
    // this line is true devil: if I comment this out, it produce image [1], in this case produce image [2]
    glLoadMatrix(buffer);
    }
}
埃莱姆斯·格兰

我已经修改了tick方法:

@Override
public void tick(float aTick) {
    float m01 = matrix.get(1);
    float m02 = matrix.get(2);
    float m04 = matrix.get(4);
    float m06 = matrix.get(6);
    float m08 = matrix.get(8);
    float m09 = matrix.get(9);
    float m12 = matrix.get(12);
    float m13 = matrix.get(13);
    float m14 = matrix.get(14);
    buffer.put(matrix);
    buffer.put(1, m04);
    buffer.put(2, m08);
    buffer.put(4, m01);
    buffer.put(6, m09);
    buffer.put(8, m02);
    buffer.put(9, m06);
    buffer.put(12, -(matrix.get(0) * m12 + m01 * m13 + m02 * m14));
    buffer.put(13, -(m04 * m12 + matrix.get(5) * m13 + m06 * m14));
    buffer.put(14, -(m08 * m12 + m09 * m13 + matrix.get(10) * m14));
    buffer.rewind();
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glLoadMatrix(buffer);
}

正如immibis指出的那样-我没有复制matrixdo的所有值buffer-不良的副作用是错误的深度缓冲区计算。

现在好啦。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

OpenGL中的缓冲区绘图

来自分类Dev

OpenGL计算着色器中的样本深度缓冲区

来自分类Dev

OpenGL FBO不增加深度缓冲区

来自分类Dev

OpenGL ES 2.0是否可以同时绘制深度和“颜色”缓冲区(不使用MRT)?

来自分类Dev

glsl es 2.0丢弃和深度缓冲区

来自分类Dev

OpenGL GL_COLOR_BUFFER_BIT属性位是否表示深度和模板缓冲区相关的状态?

来自分类Dev

OpenGL复制顶点缓冲区对象

来自分类Dev

为什么我的opengl场景有深度缓冲区问题?

来自分类Dev

使用OpenCL获取OpenGL缓冲区

来自分类Dev

如何增加OpenGL缓冲区?

来自分类Dev

在OpenGL ES中使用深度和模具渲染缓冲区附件作为帧缓冲区

来自分类Dev

深度缓冲区和模板缓冲区问题QML

来自分类Dev

OpenGL glMultiDrawElementsIndirect与交错缓冲区

来自分类Dev

OpenGL帧缓冲区深度不起作用

来自分类Dev

在C ++中实现栅格化和深度缓冲区

来自分类Dev

深度缓冲区似乎不起作用-OpenGL Shader

来自分类Dev

OpenGL缓冲区问题

来自分类Dev

不能混合使用OpenGL缓冲区和CPU缓冲区

来自分类Dev

Opengl OpenTK-绘制深度缓冲区时出现白屏

来自分类Dev

深度+模板帧缓冲区问题

来自分类Dev

OpenGL ES上深度缓冲区的精度

来自分类Dev

OpenGL缓冲区,gLFlush和glutSwapBuffers()

来自分类Dev

在OpenGL中查看深度缓冲区

来自分类Dev

OPENGL ES 2.0。安卓。深度缓冲区的奇怪行为

来自分类Dev

在OpenGL ES 2.0中,将FBO与纹理深度缓冲区一起使用时,深度纹理缓冲区不起作用

来自分类Dev

在C ++中实现栅格化和深度缓冲区

来自分类Dev

OpenGL分层渲染和渲染缓冲区

来自分类Dev

FBO深度缓冲区为红色

来自分类Dev

在 openGL 上将深度缓冲区显示为图像

Related 相关文章

热门标签

归档