简体   繁体   English

片段着色器似乎不精确地落在floor()上

[英]Fragment shader seems to floor() imprecisely

I'm trying to interpolate coordinates in my fragment shader. 我正在尝试在片段着色器中插入坐标。 Unfortunately if close to the upper edge the interpolated value of fVertexInteger seems to be rounded up instead of beeing floored. 不幸的是,如果接近上边缘,则fVertexInteger的插值似乎是四舍五入的,而不是fVertexInteger This happens above approximately fVertexInteger >= x.97 . 这发生在大约fVertexInteger >= x.97

Example: 例:

  • floor(64.7) returns 64.0 --> correct floor(64.7)返回64.0 >正确

  • floor(64.98) returns 65.0 --> incorrect floor(64.98)返回65.0 >错误

The same happens on ceiling close above x.0 , where ceil(65.02) returns 65.0 instead of 66.0 . x.0以上的天花板收盘处x.0发生同样的情况,其中ceil(65.02)返回65.0而不是66.0

Q: Any ideas how to solve this? 问:有什么想法如何解决?

Note: 注意:

  • GL ES 2.0 with GLSL 1.0 带有GLSL 1.0的GL ES 2.0
  • highp floats are not supported in fragment shaders on my hardware 我的硬件上的片段着色器不支持highp float
  • flat varying hasn't been a solution, because I'm drawing TRIANGLE_STRIP and can't redeclare the provoking vertex (only OpenGL 3.2+) 平面变化不是一个解决方案,因为我正在绘制TRIANGLE_STRIP并且无法重新声明令人发指的顶点(仅OpenGL 3.2+)

Fragment Shader: 片段着色器:

varying float fVertexInteger;
varying float fVertexFraction;
void main() {

    // Fix vertex integer
    fixedVertexInteger = floor(fVertexInteger);

    // Fragment color
    gl_FragColor = vec4(
        fixedVertexInteger / 65025.0,
        fract(fixedVertexInteger / 255.0),
        fVertexFraction,
        1.0 );

}

我不完全知道什么是精度mediump float实际上是在OpenGL ES在Android,但最有可能的解释是,该文本(或实际代码的变化值) 64.98已四舍五入为65 (使用圆最接近的位置),甚至还没有放到floor

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM