【GLSL】基本知识以及如何查看电脑显卡和GLSL版本信息
2018-02-09 15:52
585 查看
假装有个前言
因为一开始学的时候学得一脸懵逼很苦恼,所以现在整理的时候尽量用(我觉得)浅显的语言来解释,如果还有不懂的请留言,如果我理解错了什么东西也欢迎留言指出 (。・∀・)ノ゛
GLSL
GLSL是用来在OpenGL中着色编程的语言,是用来在GPU上执行的,开发人员写的一些短小的自定义程序。这些程序是用来取代固定的渲染管线的,使得渲染管线中的不同层次具有了可编程性。
-
什么是渲染管线?
渲染管线做的事情是让计算机完成图形功能。我的理解是,假设已经有了光照,物体和摄像机,我们要做的就是让计算机来告诉我们摄像机上拍出来的照片是什么样子的。
-
什么是固定渲染管线?
计算机为了告诉我们摄像机上拍出来的照片是什么样子的,要进行一系列的步骤,大致如下图所示:
这就是最早的固定管线。上图中的每一个步骤中都会有一些参数(比如光照模式,纹理模式等)。整个渲染过程就像是一个流水线,流水线上有很多道工序,每一道工序上都有几个可选的开关,要想实现不同的效果,只要去开合不同的开关就可以了。
-
什么是可编程渲染管线?
人们发现只通过有限的开合开关的组合来渲染,效果实在是不理想,于是把渲染模式换成了让流水线上坐着几个工人,然后对这些工人下指令,这样就可以通过不同的指令实现更多种,更复杂的渲染模式了。在这个过程中。这里的工人起的作用,也就是我们要说到的着色器(shader)的作用。
着色器(具体内容后面再说> <)
GLSL的着色器代码可以大致分为:
顶点着色器 Vertex shader:
用于顶点的操作,在每个顶点处都会被调用一次。一般可以用来计算顶点的位置,计算光照方程,产生贴图坐标等。
片段着色器 Fragment shader:
用于光栅化时,给非顶点位置插值等。
有时还会有几何着色器 Geometry shader:
可以用来增加一些顶点,删除一些顶点等。
和其它东西一样,不同版本的GLSL差别很大,一些特性仅高版本支持。因此开始学习之前首先要知道你的电脑支持的GLSL是什么版本的。配置好OpenGL之后,运行以下代码:
运行成功即可看到显卡和支持的GLSL版本信息:
感觉自己什么都没说怎么就结束了……现在再看感觉这些好基础,但是当时上课的时候就什么都听不懂一脸懵逼 (:з」∠)
讲得好像还不是很清楚,安利几个链接:
1. https://learnopengl-cn.github.io/ OpenGL教程翻译,很基础好用
2. https://www.zhihu.com/question/28024422 关于固定管线和可编程管线的讨论,这个答案挺详细的
暂时没什么别的了,就这样吧(顶锅盖溜走
因为一开始学的时候学得一脸懵逼很苦恼,所以现在整理的时候尽量用(我觉得)浅显的语言来解释,如果还有不懂的请留言,如果我理解错了什么东西也欢迎留言指出 (。・∀・)ノ゛
GLSL
GLSL是用来在OpenGL中着色编程的语言,是用来在GPU上执行的,开发人员写的一些短小的自定义程序。这些程序是用来取代固定的渲染管线的,使得渲染管线中的不同层次具有了可编程性。
-
什么是渲染管线?
渲染管线做的事情是让计算机完成图形功能。我的理解是,假设已经有了光照,物体和摄像机,我们要做的就是让计算机来告诉我们摄像机上拍出来的照片是什么样子的。
-
什么是固定渲染管线?
计算机为了告诉我们摄像机上拍出来的照片是什么样子的,要进行一系列的步骤,大致如下图所示:
这就是最早的固定管线。上图中的每一个步骤中都会有一些参数(比如光照模式,纹理模式等)。整个渲染过程就像是一个流水线,流水线上有很多道工序,每一道工序上都有几个可选的开关,要想实现不同的效果,只要去开合不同的开关就可以了。
-
什么是可编程渲染管线?
人们发现只通过有限的开合开关的组合来渲染,效果实在是不理想,于是把渲染模式换成了让流水线上坐着几个工人,然后对这些工人下指令,这样就可以通过不同的指令实现更多种,更复杂的渲染模式了。在这个过程中。这里的工人起的作用,也就是我们要说到的着色器(shader)的作用。
着色器(具体内容后面再说> <)
GLSL的着色器代码可以大致分为:
顶点着色器 Vertex shader:
用于顶点的操作,在每个顶点处都会被调用一次。一般可以用来计算顶点的位置,计算光照方程,产生贴图坐标等。
片段着色器 Fragment shader:
用于光栅化时,给非顶点位置插值等。
有时还会有几何着色器 Geometry shader:
可以用来增加一些顶点,删除一些顶点等。
和其它东西一样,不同版本的GLSL差别很大,一些特性仅高版本支持。因此开始学习之前首先要知道你的电脑支持的GLSL是什么版本的。配置好OpenGL之后,运行以下代码:
#include<Windows.h> #include<stdio.h> #include<stdlib.h> #include<GL/glew.h> #include<gl/glut.h> #include<GL/GL.h> #include<GL/GLU.h> #include <GLFW\glfw3.h> #include <glad/g456lad.h> int main(int argc, char** argv) { //要注意的是,这里的初始化步骤是必须的 //否则下面的那些信息会输出乱码(还是NULL来着 //别问我是怎么知道的,一把懵逼泪 glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(300, 300); glutInitWindowPosition(100, 100); glutCreateWindow("OpenGL Version"); const GLubyte* renderer = glGetString(GL_RENDERER); const GLubyte* vendor = glGetString(GL_VENDOR); const GLubyte* version = glGetString(GL_VERSION); const GLubyte* glslVersion = glGetString(GL_SHADING_LANGUAGE_VERSION); GLint major, minor; glGetIntegerv(GL_MAJOR_VERSION, &major); glGetIntegerv(GL_MINOR_VERSION, &minor); printf("GL Vendor : %s\n", vendor); printf("GL Renderer : %s\n", renderer); printf("GL Version(string) : %s\n", version); printf("GL Version(integer) : %d.%d\n", major, minor); printf("GLSL Version : %s\n", glslVersion); system("pause"); return 0; }
运行成功即可看到显卡和支持的GLSL版本信息:
感觉自己什么都没说怎么就结束了……现在再看感觉这些好基础,但是当时上课的时候就什么都听不懂一脸懵逼 (:з」∠)
讲得好像还不是很清楚,安利几个链接:
1. https://learnopengl-cn.github.io/ OpenGL教程翻译,很基础好用
2. https://www.zhihu.com/question/28024422 关于固定管线和可编程管线的讨论,这个答案挺详细的
暂时没什么别的了,就这样吧(顶锅盖溜走
相关文章推荐
- Druid基本使用配置以及如何查看sql信息监控日志
- 查看nginx | apache | php | tengine | tomcat版本的信息以及如何隐藏版本信息【转】
- 如何查看Oracle Apps的版本信息以及模块信息
- 如何查看SQL Server的版本、补丁包信息?以及如何鉴别是否需要升级自己的SQL Server?
- 查看nginx | apache | php | tengine | tomcat版本的信息以及如何隐藏版本信息
- 查看nginx | apache | php | tengine | tomcat版本的信息以及如何隐藏版本信息
- Mac 如何查看电脑的蓝牙版本信息
- 如何查看linux发行版版本信息
- 如何查看自己电脑上windows installer的版本?
- 如何查看ubuntu的版本信息和查看几位 32 or 64位
- Linux下如何查看CPU型号、个数、核数、逻辑CPU数、位数、发行版本、内核信息、内存、服务器生产厂家
- JSP/Servlet,Tomcat,Jstl各版本对比以及如何查看版本
- Android 版本信息如何查看
- ubuntu下如何查看软件安装目录以及安装版本
- [置顶] 如何查看连接自己wifi 的设备数目以及详细信息
- 查看电脑显卡信息
- Linux系统如何查看版本信息
- 6. 查询orcle版本信息(如何查看Orcle是32位的还是64位)?
- 如何查看apk的VersionCode、VersionName等版本信息
- ubuntu下如何查看软件安装目录以及安装版本