zoukankan      html  css  js  c++  java
  • 关于OpenGL nativeZ 到 LinearZ 精度缺失问题探究

    我再看其他引擎的时候看到一个点,就是他先渲染不透明物体到NativeZ,后面根据这个深度图,得到LinearZ

    这里OpenGL教程里面也有

    https://learnopengl.com/Advanced-OpenGL/Depth-testing

    然后周末我自己也这样做了,后面反复思考这样有没有问题

    下面是我做的实验代码

    投影矩阵我是看这里写的

    https://zhuanlan.zhihu.com/p/73034007

    #include<stdio.h>
    #include<conio.h>
    #include<windows.h>
    #include<iostream>
    #include <cassert>
    
    //计算nativeZ
    float NativeZ(float nearv, float farv, float EyePosZ)
    {
        
        float zx = (farv + nearv) / (farv - nearv) + (2.0 * farv* nearv / (farv - nearv)) / EyePosZ;
        return zx;
    }
    
    //NativeZ to LinearZ
    float LinearizeDepth(float nearv,float farv,float Nativedepth)
    {
        float z = Nativedepth * 2.0 - 1.0; // back to NDC 
        return (2.0 * nearv * farv) / (farv + nearv - z * (farv - nearv)) /(farv -nearv);
    }
    
    //自己计算LinearZ,不依赖NativeZ
    float MyLinearCalc(float nearv, float farv, float eyePosZ)
    {
        float zv = -eyePosZ; //Opengl相机空间里 z是负值
    
        float x = (zv -nearv) / (farv - nearv);
    
        return x;
    }
    
    const float CameraFar = 4000;
    const float CameraNear = 2;
    
    
    int main()
    {
        const int stepN = 40;
        for (int n = 0; n < stepN; ++n)
        {
            float eyePosZ = -n * (CameraFar -CameraNear) / (float)stepN - CameraNear;
            float nativeZ = NativeZ(CameraNear, CameraFar, eyePosZ);
            float linearv = LinearizeDepth(CameraNear, CameraFar, nativeZ);
            float myCalcZ = MyLinearCalc(CameraNear, CameraFar, eyePosZ);
    
    
            printf("nativeZ:%f  %f  %f 
    ", nativeZ,linearv,myCalcZ);
        }
        int delay;
        scanf("%d",&delay);
    }

    代码很容易,先计算NativeZ,然后这个NativeZ 变换到Linearz,这是float32 的精度

    这里写错了,有空来改

  • 相关阅读:
    Extjs打开window窗口自动加载html网页
    CSS预处理器之SASS用法指南
    HmacSHA256摘要算法
    Base64编解码
    孔子困于陈蔡故事(转载)
    我的2019
    给Oracle字段和表加注释
    【JDBC】使用properties连Oracle数据库,使用DatabaseMetaData获取字段的注释
    [JDBC]查询结果集把字段名和字段值一起竖向输出
    [Java/Reflect]使用反射机制获得一个对象的属性名和属性值
  • 原文地址:https://www.cnblogs.com/dragon2012/p/14775696.html
Copyright © 2011-2022 走看看