在OpenGL ES中计算雾的坐标。

问题描述 投票:0回答:1

在顶点着色器中找到了两种计算雾坐标的方法。

#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);
    ...
}

没有发现视觉上的差异

问题:这两种变体有区别吗? 这两种变体有区别吗?如果没有,在性能上用哪种更好?先谢谢了!

android opengl-es glsl shader
1个回答
1
投票

在文献中发现(Randi J. Rost,OpenGL):第一个变体--是用观察空间中坐标z的绝对值来逼近深度值。在一个非常大的视角下,这样的近似会引起明显的图像缺陷(边缘的轻微雾气)。在这种情况下,可以计算为从视点到碎片的距离(第二种变体)。这种方法涉及到计算平方根,这将略微降低性能。

© www.soinside.com 2019 - 2024. All rights reserved.