1.  Shader起步

1.1.  可编程管线

仅考虑Vertex shader和fragment shader:

1.2.  Shader Object

在编译阶段生成,把shader源代码编译成Shader 对象。

Shader对象分类

  • Vertex Shader
  • Fragment Shader
  • Geometry Shader
  • Tess EvaluationShader
  • Tess ControlShader

API:

glCreateShader
glCompileShader
glDeleteShader
glGetShaderiv
glGetShaderInfoLog

1.3.  Shader Program

在链接阶段,创建shader程序,链接shader对象。

API:

glCreateProgram
glAttachShader
glLinkProgram
glUseProgram
glDeleteProgram
glGetProgramiv
glGetProgramInfoLog

2.  Shader编程入门

2.1.  编写Shader

Vertex Shader:

#version 400
in vec3 VertexPosition;
in vec3 VertexColor;
out vec3 Color; void main()
{
Color = VertexColor;
gl_Position = vec4(VertexPosition,1.0);
}

// Color: 输出变量,在fragment shader中使用

// gl_position: 内建的输出变量

Fragment Shader:

#version 400
in vec3 Color;
out vec4 FragColor;
void main()
{
FragColor = vec4(Color, 1.0);
}

2.2.  绑定参数

定义顶点属性索引与vertex shader输入变量之间的映射关系

glBindAttribLocation(programHandle,0, "VertexPosition");

glBindAttribLocation(programHandle,1, "VertexColor");

glBindFragDataLocation(programHandle,0, "FragColor");

2.3.  创建几何对象

Buffer对象 (VBO)

glGenBuffers  // 创建buffer对象

glBindBuffer // 指定当前要绑定的VBO

glBufferData// 设置Buffer对象数据

VertexArray对象(VAO):把VBO组装成VAO

glGenVertexArrays

glBindVertexArray //指定当前要绑定的VAO

glEnableVertexAttribArray //启用渲染使用的Buffer

glBindBuffer// 指定当前要绑定的VBO

glVertexAttribPointer//设置VAO如何使用的VBO数据

2.4.  绘制几何对象

glBindVertexArray//指定当前要绑定的VAO

glDrawArrays//绘制图元格式

2.5.  技巧

2.5.1.  layout qualifiers

在shader中指定输入参数对应的vertex buffer index

layout (location = 0) in vec3 VertexPosition;

layout (location = 1) in vec3 VertexColor;

layout (location = 0) out vec4 FragColor;

2.5.2.  element arrays

使用index buffer

2.5.3.  Interleaved arrays

用一个buffer object存放vertex的多个属性。

不建议使用。

最新文章

  1. Ubuntu install codeblocks by ppa
  2. MySQL max_allowed_packet设置及问题
  3. spring mvc定时任务的简单使用
  4. [LeetCode]题解(python):038-Count and Say
  5. linux 关闭显示器命令
  6. Monolog - Logging for PHP 5.3+
  7. js 之 复制一段代码
  8. (转载)让ie6也支持max-width,和max-height实现图片等比例缩放
  9. Java---设计模块(单例的变形)(多例)
  10. HTML5 Canvas基础知识
  11. 怎样学习java?
  12. GEF的MVC体系结构
  13. python __init__() 和__new__()简析
  14. (O)阻止默认事件和阻止冒泡的应用场景
  15. if 语句 写了return 报错
  16. shell 脚本中所有循环语法
  17. Scrum 4.0(未完待续)
  18. P4433 [COCI2009-2010#1] ALADIN
  19. sed.md
  20. 20145335郝昊 Java学习心得 密码学代码复写

热门文章

  1. CocoaChina(总结)升级到xcode8遇到的问题及解决方案
  2. Gazebo機器人仿真學習探索筆記(六)工具和实用程序
  3. TextView的升级版———AutoCompleteTextView
  4. Dynamics CRM2013 Form利用window.location.reload()进行全局刷新带来的问题及解决办法
  5. Dynamics CRM 权限整理二
  6. RxJava操作符(03-变换操作)
  7. 《高性能MySQL》读书笔记(上)
  8. 抽屉效果的实现(DrawerLayout和SlidingMenu的对比)
  9. Android核心安全机制(一)
  10. linux ubuntu系统下MySQL的安装及设置