OPENGL学习笔记整理(五):着色语言
有些事情本身就是十分奇怪的。在传统上,图形硬件的设计目的是用于快速执行相同的硬编译指令集。不同的计算步骤可以被跳过,参数可以被调整,但计算本身确实固定不变的。然而,随着技术的发展,却越来越变得可以编程了。着色语言,都有些OUT了,CUDA、OPENCL什么的越来越大行其道了。当然,在这里,主要还是介绍着色语言。有些东西很新,但是却不成熟。有些东西很旧,很老土,却仍然很好用,就连OPENGL不带着色语言,现在仍然能做出很好的效果,这也是毋庸置疑的。
传统的或称是旧式的OPENGL渲染管线的操作过程如下,(顶点和它们相关的属性)->(转换)->(光照)->(纹理坐标生成和转换)->(裁剪)->(点、直线、多边形、位图和像素矩阵的光栅化:包括平滑的、宽阔的、剔除和深度偏移的图元)->【片段和它们相关的属性】->(纹理)->(颜色求和)->(雾)->(抗锯齿)->(基于片段的操作:像素拥有权、裁剪测试、alpha测试、模板测试、混合、抖动、逻辑操作和帧缓冲区写入)。
着色语言,是把整个图形管线的中的某些部分独立出来,变成可以编程的,即顶点着色器和片元着色器。(转换)->(光照)->(纹理坐标生成和转换)->(裁剪)的功能交给顶点着色器,纹理)->(颜色求和)->(雾)->(抗锯齿)的功能交给片段着色器。
图形管线的问题,我也是搞了很久之后才有这个概念的,其实也就是这么几个步骤。如果你了解GPU历史的话,或许理解起来会更轻松一些,GPU最初的出现和T&L是紧密联系在一起的,这里的T就是tranform或者translate,具体是哪个单词,我现在忘了,功能就是空间变换,L则显然是LIGHTING了,光照。那么顶点着色器的作用,就是完成T&L中T的所有工作及L的所有空间坐标相关的工作,而片元着色器则是做颜色合成的工作。原先,顶点着色器和片元着色器在硬件上是分开的,现在大家都统一了。
如果你会普通的OPENGL编程,那么你只要稍微修改下自己的思路其实就OK了。你可以想象下,你现在不再是活在三维笛卡尔空间里面的人了,你是活在极坐标当中的,可以活在自己设定的某种规则的空间当中,光照效果也不再是那么固定的了,你可以自己改变。还是看看具体的程序或者会比较容易理解。
下面相关的代码来自 OpenGL SuperBible, Chapter 16, Demonstrates vertex blending,该程序只用到了顶点着色器,vertex shader。
int main(int argc, char* argv[])
{
GLint i; glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(windowWidth, windowHeight);
glutCreateWindow("Vertex Shaders Demo");
glutReshapeFunc(ChangeSize);
glutKeyboardFunc(KeyPressFunc);
glutSpecialFunc(SpecialKeys);
glutDisplayFunc(RenderScene); SetupRC(); // Create the menus
shaderMenu = glutCreateMenu(ProcessMenu);
for (i = 0; i < TOTAL_SHADERS; i++)
{
char menuEntry[128];
sprintf(menuEntry, "\"%s\"", shaderNames[i]);
glutAddMenuEntry(menuEntry, 1+i);
} mainMenu = glutCreateMenu(ProcessMenu);
{
char menuEntry[128];
sprintf(menuEntry, "Choose vertex shader (currently \"%s\")", shaderNames[0]);
glutAddSubMenu(menuEntry, shaderMenu);
}
glutAttachMenu(GLUT_RIGHT_BUTTON); glutMainLoop(); if (glDeleteShader && glDeleteProgram)
{
for (i = 0; i < TOTAL_SHADERS; i++)
{
glDeleteProgram(progObj[i]);
glDeleteShader(vShader[i]);
}
} return 0;
}
OPENGL学习笔记整理(五):着色语言的更多相关文章
- OpenGL学习笔记(五)变换
目录 变换 向量 向量的运算 向量与标量运算 向量取反 向量加减 求向量长度 向量的单位化 向量相乘 点乘(Dot Product) 叉乘 矩阵 矩阵的加减 矩阵的数乘 矩阵相乘 矩阵与向量相乘 与单 ...
- Python学习笔记整理总结【语言基础篇】
一.变量赋值及命名规则① 声明一个变量及赋值 #!/usr/bin/env python # -*- coding:utf-8 -*- # _author_soloLi name1="sol ...
- Python学习笔记整理(五)Python中的列表.
列表和字段,这两种类型几乎是Python所有脚本的主要工作组件.他们都可以在原处进行修改,可以按需求增加或缩短,而且包含任何种类的对象或者被嵌套. 一.列表 列表的主要属性: *任意对象的有序集合 从 ...
- opengl学习笔记(五):组合变换,绘制一个简单的太阳系
创建太阳系模型 描述的程序绘制一个简单的太阳系,其中有一颗行星和一颗太阳,用同一个函数绘制.需要使用glRotate*()函数让这颗行星绕太阳旋转,并且绕自身的轴旋转.还需要使用glTranslate ...
- Deep Learning(深度学习)学习笔记整理系列之(五)
Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...
- Deep Learning(深度学习)学习笔记整理系列之(七)
Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...
- Deep Learning(深度学习)学习笔记整理系列之(二)
Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...
- Deep Learning(深度学习)学习笔记整理系列之(八)
Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...
- Deep Learning(深度学习)学习笔记整理系列之(六)
Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...
随机推荐
- 使用OPENROWSET(BULK...)从平面文件加载数据
要使用OPENROWSET首先要开启一个configure选项 sp_configure ‘show advanced options’, 1;GORECONFIGURE;GOsp_configure ...
- 大数据时代下的用户洞察:用户画像建立(ppt版)
大数据是物理世界在网络世界的映射,是一场人类空前的网络画像运动.网络世界与物理世界不是孤立的,网络世界是物理世界层次的反映.数据是无缝连接网络世界与物理世界的DNA.发现数据DNA.重组数据DNA是人 ...
- ubuntu下搭建hive(包括hive的web接口)记录
Hive版本 0.12.0(独立模式) Hadoop版本 1.12.1 Ubuntu 版本 12.10 今天试着搭建了hive,差点迷失在了网上各种资料中,现在把我的经验分享给大家,亲手实践过,但未必 ...
- 局部敏感哈希Locality Sensitive Hashing(LSH)之随机投影法
1. 概述 LSH是由文献[1]提出的一种用于高效求解最近邻搜索问题的Hash算法.LSH算法的基本思想是利用一个hash函数把集合中的元素映射成hash值,使得相似度越高的元素hash值相等的概率也 ...
- Netty那点事
一.Netty是什么 Netty,无论新手还是老手,都知道它是一个“网络通讯框架”. 所谓框架,基本上都是一个作用:基于底层API,提供更便捷的编程模型. 那么”通讯框架”到底做了什么事情呢?回答这个 ...
- JQuery Selectors 方法说明
基本选择器 $("#myDiv") 匹配唯一的具有此id值的元素 $("div") 匹配指定名称的所有元素 $(".myClass") 匹配 ...
- Volley HTTP库系列教程(3)自定义RequestQueue和编写单例RequestQueue示例
Setting Up a RequestQueue Previous Next This lesson teaches you to Set Up a Network and Cache Use a ...
- java 文件text的写入
日志文件 OutputStream out = new FileOutputStream(f, true); if (list1.size() > 0) { int h1 = 0; for (i ...
- SQL注入实验,PHP连接数据库,Mysql查看binlog,PreparedStatement,mysqli, PDO
看到有人说了判断能否sql注入的方法: 简单的在参数后边加一个单引号,就可以快速判断是否可以进行SQL注入,这个百试百灵,如果有漏洞的话,一般会报错. 下面内容参考了这两篇文章 http://blog ...
- R语言,NA,NAN
好莫名其妙的结果 is.na() #NA得不到的值is.nan() #NAN不可能的值is.infinite() #无穷的 x1<-NA x2<-0/0x3<-1/0 is.na(x ...