【发布时间】:2015-08-12 02:21:08
【问题描述】:
为了实现this idea,我编写了以下两个版本的顶点和片段着色器:
// Vertex:
precision highp int;
precision highp float;
uniform vec4 r_info;
attribute vec2 s_coords;
attribute vec2 r_coords;
varying vec2 t_coords;
void main (void) {
int w = int(r_info.w);
int x = int(r_coords.x) + int(r_coords.y) * int(r_info.y);
int y = x / w;
x = x - y * w;
y = y + int(r_info.x);
t_coords = vec2(x, y) * r_info.z;
gl_Position = vec4(s_coords, 0.0, 1.0);
}
// Fragment:
precision highp float;
uniform sampler2D sampler;
uniform vec4 color;
varying vec2 t_coords;
void main (void) {
gl_FragColor = vec4(color.rgb, color.a * texture2D(sampler, t_coords).a);
}
对比
// Vertex:
precision highp float;
attribute vec2 s_coords;
attribute vec2 r_coords;
varying vec2 t_coords;
void main (void) {
t_coords = r_coords;
gl_Position = vec4(s_coords, 0.0, 1.0);
}
// Fragment:
precision highp float;
precision highp int;
uniform vec4 r_info;
uniform sampler2D sampler;
uniform vec4 color;
varying vec2 t_coords;
void main (void) {
int w = int(r_info.w);
int x = int(t_coords.x) + int(t_coords.y) * int(r_info.y);
int y = x / w;
x = x - y * w;
y = y + int(r_info.x);
gl_FragColor = vec4(color.rgb, color.a * texture2D(sampler, vec2(x, y) * r_info.z).a);
}
它们之间的唯一区别(我希望)是纹理坐标转换的位置。在第一个版本中,数学发生在顶点着色器中,在第二个版本中,它发生在片段着色器中。
现在,官方OpenGL ES SL 1.0 Specifications 声明“[t]he vertex 语言必须提供至少 16 位的整数精度,加上一个符号位”和“[t]he fragment 语言必须提供至少 10 位的整数精度,外加一个符号位”(第 4.5.1 章)。如果我理解正确,这意味着只给出一个最小的实现,我应该能够在顶点着色器中获得的精度应该比在片段着色器中更好,对吗?但是,出于某种原因,代码的 第二 版本可以正常工作,而第一个版本会导致一堆舍入错误。我错过了什么吗???
【问题讨论】: