フラグメント シェーダーで座標を補間しようとしています。残念なことに、上端に近い場合、補間された値は、fVertexInteger
床に置かれるのではなく、切り上げられるように見えます。これは約 の上で起こりますfVertexInteger >= x.97
。
例:
floor(64.7)
戻ります64.0
--> 正しいfloor(64.98)
戻ります65.0
--> 正しくありません
同じことが、の代わりに を返すx.0
、の上の天井の近くで起こります。ceil(65.02)
65.0
66.0
Q:これを解決する方法はありますか?
ノート:
- GLSL 1.0 を使用した GL ES 2.0
- ハードウェアのフラグメント シェーダーで highp float がサポートされていません
- 私は TRIANGLE_STRIP を描いており、挑発的な頂点を再宣言できないため、フラットな変化は解決策ではありませんでした (OpenGL 3.2+ のみ)。
フラグメント シェーダー:
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 );
}