android - OpenGL ES中雾坐标的计算
问题描述
在顶点着色器中找到了两种计算雾坐标的方法:
#version 300 es
uniform mat4 u_mvMatrix;
in vec4 a_position;
smooth out float v_fog_factor;
const float startFog = 10.0;
const float endFog = 140.0;
float getFogFactor(float fogCoord) { // linear fog
float factor = (endFog - fogCoord) / (endFog - startFog);
factor = 1.0 - clamp(factor, 0.0, 1.0);
return factor;
}
void main() {
vec4 v_eye_space_pos = u_mvMatrix * a_position;
// VARIANT I: obtain cartesian coordinate z
float fogCoord = abs(v_eye_space_pos.z / v_eye_space_pos.w);
// VARIANT II: obtain distance
float fogCoord = length(v_eye_space_pos);
v_fog_factor = getFogFactor(fogCoord);
...
}
没有注意到视觉差异。
问题:这两种变体有区别吗?如果不是,就性能而言,使用哪一个更好?提前致谢!
解决方案
在文献中找到(Randi J. Rost,OpenGL):第一个变体 - 是使用观察空间中坐标 z 的绝对值来近似深度值。对于非常大的视角,这样的近似会引起明显的图像缺陷(边缘处有轻微的雾)。在这种情况下,它可以计算为从视点到片段的距离(第二个变体)。此方法涉及计算平方根,这会稍微降低性能。
推荐阅读
- javascript - React js CSS模块找不到@keyframes
- javascript - CSS 样式部分应用于 React 组件中的按钮
- firebase - Firebase Firestore 和函数 404 ERR_ABORTED
- c - 在 Linux/POSIX 系统上安装 C 头文件
- mysql - 将三个不同表的 SQL 中的计数除以平均值
- c++ - C ++如何处理模板中的不同类
- python - 为 N 个点插值一个 xarray DataArray 并获得一个使用 dask 插值的 N 列表
- python - 将默认参数传递给子类的更好方法
- javascript - 在 React 中使用 map() 和 onClick() 时切换特定项目而不是其他项目
- arrays - 我需要使用 JS 的 flat 方法来展平一个多维数组。这是数组 [ ["1", "0"], ["3", "5", ["8", ["10"], "11"] ], ]