opengl模拟太阳效果
【摘要】
参考: http://www.cnblogs.com/tkgamegroup/p/4198811.html
我决定开个新坑了。以后每周五更新。
这是GLSL的学习周记!
GLSL就是OPENGL SHADER LANGUAGE的简称,就是着色器语言。
着色器是一种交给显卡运行的小程序,这种小程序可以用GLSL来写,写好后交给OPENGL编译,就可以在显卡上...
参考: http://www.cnblogs.com/tkgamegroup/p/4198811.html
我决定开个新坑了。以后每周五更新。
这是GLSL的学习周记!
GLSL就是OPENGL SHADER LANGUAGE的简称,就是着色器语言。
着色器是一种交给显卡运行的小程序,这种小程序可以用GLSL来写,写好后交给OPENGL编译,就可以在显卡上运行了。
那么问题来了!为什么要给显卡运行呢?
显卡是一种特殊的处理器,有核心,有寄存器,还有内存,不过对比CPU,最大的特点就是显卡的核心更多。多多少呢?一般CPU有4-8个核心,而显卡则是100个左右的核心!不过由于造价还有空间的限制,显卡的某些功能会被削弱,例如逻辑判断功能(if) 。但是它的浮点运算能力却非常强大哦!
为什么显卡要制作这么多核心呢?因为,在图像处理方面,是非常适合用并行计算的。所谓并行计算,就是两个并行计算之间不需要彼此的数据。而图像正是非常符合这个特点!想象一下,假如要在屏幕上显示一幅图画,那么可以交给这些核心这么一个工作:每个核心处理图画的每一行,把图画的每一行的像素画到屏幕上面。这种工作并行计算再适合不过了!因为这里面不包括任何的逻辑处理部分。
好了,是不是也想让显卡帮我们并行计算呢?
**使用着色器功能会暂时关闭大量的OPENGL原有功能,包括光照等。你也可以在一次渲染中使用着色器和原有功能,在需要着色器的时候使用着色器,不需要的时候关闭就可以了
要使用GLSL先要这样:
#include <glew.h>
// 链接glew.lib (用工程属性或者预编译命令)
// 创建OPENGL窗口 (用你最熟悉的创建方法)
GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
我决定开个新坑了。以后每周五更新。
这是GLSL的学习周记!
GLSL就是OPENGL SHADER LANGUAGE的简称,就是着色器语言。
着色器是一种交给显卡运行的小程序,这种小程序可以用GLSL来写,写好后交给OPENGL编译,就可以在显卡上运行了。
那么问题来了!为什么要给显卡运行呢?
显卡是一种特殊的处理器,有核心,有寄存器,还有内存,不过对比CPU,最大的特点就是显卡的核心更多。多多少呢?一般CPU有4-8个核心,而显卡则是100个左右的核心!不过由于造价还有空间的限制,显卡的某些功能会被削弱,例如逻辑判断功能(if) 。但是它的浮点运算能力却非常强大哦!
为什么显卡要制作这么多核心呢?因为,在图像处理方面,是非常适合用并行计算的。所谓并行计算,就是两个并行计算之间不需要彼此的数据。而图像正是非常符合这个特点!想象一下,假如要在屏幕上显示一幅图画,那么可以交给这些核心这么一个工作:每个核心处理图画的每一行,把图画的每一行的像素画到屏幕上面。这种工作并行计算再适合不过了!因为这里面不包括任何的逻辑处理部分。
好了,是不是也想让显卡帮我们并行计算呢?
**使用着色器功能会暂时关闭大量的OPENGL原有功能,包括光照等。你也可以在一次渲染中使用着色器和原有功能,在需要着色器的时候使用着色器,不需要的时候关闭就可以了
要使用GLSL先要这样:
#include <glew.h>
// 链接glew.lib (用工程属性或者预编译命令)
// 创建OPENGL窗口 (用你最熟悉的创建方法)
glewInit();
GLuint program = glCreateProgram(); // 创建着色器程序
GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
glAttachShader(program, vertex_shader);
#version 440 // 关于version:这个是GLSL的version。我使用的是4.4版本,如果你的电脑不支持,请使用更低的版本,不过低版本有的语句需要修改,也有可能是你的高性能显卡没有打开,请到你的控制面板为你的程序选择高性能显卡,或者更改全局设置
in vec4 vertex_position; // in表示由上层传递过来的数据,传递给顶点着色器的数据有坐标等,这里用到一个,就是坐标
void main()
{
gl_Position = vertex_position; // 把接受到的坐标传递给片段着色器
#version 440
void main()
{
float r = 1.0f;
float g = 1.0f;
float b = 0.5f;
// 黄色
// 黄色
vec2 p;
p.x = gl_FragCoord.x - 500;
p.y = gl_FragCoord.y - 500;
// glFragCoord表示这个点的坐标
// 在(500,500) 的地方生成光照。注意:因为OPENGL的计算方式,屏幕底部的Y坐标为0
// glFragCoord表示这个点的坐标
// 在(500,500) 的地方生成光照。注意:因为OPENGL的计算方式,屏幕底部的Y坐标为0
float length = p.x * p.x + p.y * p.y; // 距离的平方
float rate = 3000.0f / length; // 比值
gl_FragColor = vec4(rate * r, rate * g, rate * b, 1.0f); // glFragColor表示这个点的最终颜色
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glBegin(GL_QUADS);
glVertex2f(-1, -1);
glVertex2f(-1, 1);
glVertex2f(1, 1);
glVertex2f(1, -1);
glEnd();
// SwapBuffers 或者 glFlush
文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/jacke121/article/details/70257387
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)