Questions tagged «fragment-shader»

1
在片段着色器中计算纹理坐标时,为什么访问纹理要慢得多?
在GLSL中使用纹理时,最好在顶点着色器中计算最终的纹理坐标,然后使用varyings 将其移交给片段着色器。在y坐标中进行简单翻转的示例: // Vertex shader attribute vec2 texture; varying highp vec2 texCoord; // ... void main() { texCoord = vec2(texture.x, 1.0-texture.y); // ... } // Fragment shader varying highp vec2 textureCoordinates; uniform sampler2D tex; // ... void main() { highp vec4 texColor = texture2D(tex, texCoord); // ... } 如果vec2(0.5)在片段着色器中执行y坐标的翻转或什至更简单的操作(如添加到纹理坐标),则纹理访问会慢得多。为什么? 需要注意的是,例如,使用它们的加权总和来混合两个纹理在时间上要便宜得多,并且还需要针对每个像素完成,因此纹理坐标本身的计算似乎并不那么昂贵。

1
使用LUT加速移动设备的Trig重型着色器
我正在尝试使此着色器在非常老的iDevice以及最终的Android上运行。 即使将每个片段的代码减少到2个正弦函数,着色器也以约20fps的速度运行。 我已经考虑过从旧的着色技术书中摘下一片叶子,并创建一个包含一堆预定义触发值的数组,并以某种方式使用这些值来近似着色器。 在上面链接的着色器中,我已经在模拟,如果四舍五入发送到trig函数的值,则鼠标越靠左(向下),着色器的质量越差。它实际上非常酷,因为它确实在左侧非常像一个完全不同且非常酷的着色器。 无论如何,我有两个难题: 我不知道在GLSL着色器中恒定或统一的数组中拥有360个值的最有效方法是什么? 我想不通如何像通常要在0到360之间的角度放置数字一样(是的,我知道GPU使用弧度),我会这样做。 func range(float angle) { float temp = angle while (temp > 360) {temp -= 360;} while (temp < 0) {temp += 360;} return temp; } 但是,GLSL不允许使用while循环或递归函数。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.