本帖最后由 523066680 于 2017-6-6 11:22 编辑
这个机制是降低了门槛,但是新的GL很快淘汰了所有 begin 和 end 系列的函数,是因为性能瓶颈的缘故。
有大量的图像优化、像素操作可以交给 GPU。
特别是像Julia 集合图像,程序这边只需要给出画布范围大小,比如 800 * 600
把公式交给 GPU,GPU着色器在渲染图形的每一个像素点时候,通过你给定的公式计算该点的颜色值。
原图是 800x600 的(拉至全屏也不影响渲染效率,工作电脑的显卡是 GT430)
性能和易用性、自由度,往往很难兼得。
简单的脚本绘图可以脱离C语言,但是到了Shader层次,仍然是在 C/C++ 的语法上进行扩充
片元着色器/代码来自蓝皮书- // Julia set renderer - Fragment Shader
- // Graham Sellers
- // OpenGL SuperBible
-
- #version 150 core
- in vec2 initial_z;
- out vec4 color;
- uniform sampler1D tex_gradient;
- uniform vec2 C;
-
- void main(void)
- {
- vec2 Z = initial_z;
- int iterations = 0;
- float rate;
- const float threshold_squared = 16.0;
- const int max_iterations = 256;
- while (iterations < max_iterations && dot(Z, Z) < threshold_squared)
- {
- vec2 Z_squared;
- Z_squared.x = Z.x * Z.x - Z.y * Z.y + C.y;
- Z_squared.y = Z.x * Z.y * 2.0 + C.x;
- Z = Z_squared;
- iterations++;
- }
-
- if (iterations == max_iterations)
- color = vec4(0.0, 0.0, 0.0, 1.0);
- else
- rate = float(iterations) / 10.0;
- color = vec4( sin(rate), cos(1.0-rate), exp(rate), 1.0);
- }
复制代码
|