OpenGL的图像管线

A.1 OpenGL管线

A.2 C++/OpenGL应用程序

GLFW 文档 - 掘金 (juejin.cn)

在我们尝试编写着色器之前,我们先用编写一个简单的C++/OpenGL应用程序,创建一个GLFWwindow实例并为其设置背景色。

 - 初始化GLFW库
 - 实例化GLFWwindow
 - 初始化GLEW库
 - 调用一次init()函数
 - 重复调用display()函数
 - 注意:在初始化GLEW前必须先初始化GLFW,也就是说必须在调用glewInit()前先调用glfwInit()。

将每个程序的初始化任务都放在init()函数中,用于绘制GLFWwindow的代码都放在display()函数中。

 
#include <GL/glew.h>
 #include <GLFW/glfw3.h>
 #include <iostream>
 ​
 void init(GLFWwindow* window){ }
 ​
 void display(GLFWwindow* window, double currentTime)
 {
     //让我们指定颜色缓冲区清除后填充的值,rgba表示,此处为红色
     glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
     //用于清除窗口的颜色缓冲区
     glClear(GL_COLOR_BUFFER_BIT);
 }
 int main()
 {
     if (!glfwInit())
         exit(EXIT_FAILURE);
     //指定计算机必需与OpenGL版本4.3的兼容,主版本号为4,次版本号为3
     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
     //glfwCreateWindow,创建宽,高位600像素,顶部标题为Hello,World,
     // 另外两个参数分别用来表示允许全屏显示和资源共享
     GLFWwindow* window = glfwCreateWindow(600, 600, "Hello, World", nullptr, nullptr);
     //关联当前GLFW窗口和OpenGL上下文(我们创建的GLFW窗口不会自动关联OpenGL的上下文)
     glfwMakeContextCurrent(window);
 ​
     if (glewInit() != GLEW_OK)
         exit(EXIT_FAILURE);
     //开启垂直同步
     glfwSwapInterval(1);
 ​
     init(window);
 ​
     while (!glfwWindowShouldClose(window))
     {
         display(window, glfwGetTime());
         glfwSwapBuffers(window);
         //处理窗口相关的事件(如按键事件)
         glfwPollEvents();
     }
 ​
     glfwDestroyWindow(window);
     glfwTerminate();
     exit(EXIT_SUCCESS);
 }

A.3顶点着色器和片段着色器

OpenGL只能绘制几类非常简单的东西,如点、线、三角形。这些简单的东西叫图元。

图元由顶点组成,如三角形由三个顶点。

顶点来源有很多,如从文件读取并由C++/OpenGL应用载入缓冲区,直接在C++中硬编码,或者直接在GLSL代码中生成。

在加载顶点之前,C++/OpenGL应用程序必须编译并链接合适的GLSL顶点着色器和片段着色器程序,之后将他们载入管线。

我们会使用一个OpenGL的函数来构建图形,所有的顶点都会被传入顶点着色器,被逐次处理。

  • glDrawArrays()

语法:

 void WINAPI glDrawArrays(
    GLenum  mode,//要呈现的基元类型
    GLint   first,//已启用的数组中的起始索引。
    GLsizei count//要呈现的所引数
 );

使用C++硬编码的方式,画一个点

 //在C++代码中写GLSL代码--以字符串的形式
 //需要写一个顶点着色器(指定绘制的形状,一般以数组的形式传递)
 //还需一个片段着色器(主要指颜色、光照、阴影等光影效果)
 //可以将其封装到函数CreateShaderProgram
 unsigned int CreateShaderProgram()
 {
     const char* vShaderSource = 
         "#version 430 \n"
         "void main(void) \n"
         "{gl_Position = vec4(0.0, 0.0, 0.0, 1.0);}";
     //gl_Position内置的坐标变量,前三个参数对应坐标的(x,y,z),第四个参数为矩阵变换时会用到的值,变换矩阵是4x4,所有我们     //还需要添加一位才能进行矩阵的乘法
     const char* fShaderSource =
         "#version 430 \n"
         "out vec4 color; \n"
         "void main(void) \n"
         "{ color = vec4(0.0, 0.0, 1.0, 1.0); }";
     
     //创建顶点着色器和片段着色器
     unsigned int vShader = glCreateShader(GL_VERTEX_SHADER);
     unsigned int fShader = glCreateShader(GL_FRAGMENT_SHADER);
     //替换vShader,fShader中的源代码,使用自定义的编码
     glShaderSource(vShader, 1, &vShaderSource, NULL); 
     glShaderSource(fShader, 1, &fShaderSource, NULL);
     //对着色器对象进行编译
     glCompileShader(vShader);
     glCompileShader(fShader);
     //创建一个Program链接着色器对象,执行的就是链接有着色器对象的程序
     unsigned int vfProgram = glCreateProgram();
     //把之前编译的着色器附加到程序对象上,然后用glLinkProgram链接它们
     glAttachShader(vfProgram, vShader);
     glAttachShader(vfProgram, fShader);
     glLinkProgram(vfProgram);
     //返回连接好的着色器程序
     return vfProgram;
 }
 //init函数
 #define numVAOs 1
 unsigned int renderingProgram;
 unsigned int vao[numVAOs];//顶点数组,必须要有
 void init(GLFWwindow* window)
 { 
     renderingProgram = CreateShaderProgram();
     glGenVertexArrays(numVAOs, vao);//生成顶点数组对象名称,用numVAOs存储
     glBindVertexArray(vao[0]);//绑定vao[0]
 }
 //display函数
 void display(GLFWwindow* window, double currentTime)
 {
     glUseProgram(renderingProgram);//激活程序对象
     glPointSize(30.0f);//设置点的大小
     glDrawArrays(GL_POINTS, 0, 1);//绘制方式,绘制一个点
 }

完整.cpp代码

 
#include <GL/glew.h>
 #include <GLFW/glfw3.h>
 #include <iostream>
 #define numVAOs 1
 unsigned int renderingProgram;
 unsigned int vao[numVAOs];//顶点数组,必须要有
 unsigned int CreateShaderProgram();
 ​
 void init(GLFWwindow* window)
 {
     renderingProgram = CreateShaderProgram();
     glGenVertexArrays(numVAOs, vao);//生成顶点数组对象名称,用numVAOs存储
     glBindVertexArray(vao[0]);//绑定vao[0]
 }
 ​
 void display(GLFWwindow* window, double currentTime)
 {
     glUseProgram(renderingProgram);//激活程序对象
     glPointSize(30.0f);//设置点的大小
     glDrawArrays(GL_POINTS, 0, 1);//绘制方式,绘制一个点
 }
 unsigned int CreateShaderProgram()
 {
     const char* vShaderSource =
         "#version 430 \n"
         "void main(void) \n"
         "{gl_Position = vec4(0.0, 0.0, 0.0, 1.0);}";
     //gl_Position内置的坐标变量,前三个参数对应坐标的(x,y,z),第四个参数为矩阵变换时会用到的值,变换矩阵是4x4,所有我们     //还需要添加一位才能进行矩阵的乘法
     const char* fShaderSource =
         "#version 430 \n"
         "out vec4 color; \n"
         "void main(void) \n"
         "{ color = vec4(0.0, 0.0, 1.0, 1.0); }";
 ​
     //创建顶点着色器和片段着色器
     unsigned int vShader = glCreateShader(GL_VERTEX_SHADER);
     unsigned int fShader = glCreateShader(GL_FRAGMENT_SHADER);
     //替换vShader,fShader中的源代码,使用自定义的编码
     glShaderSource(vShader, 1, &vShaderSource, NULL);
     glShaderSource(fShader, 1, &fShaderSource, NULL);
     //对着色器对象进行编译
     glCompileShader(vShader);
     glCompileShader(fShader);
     //创建一个Program链接着色器对象,执行的就是链接有着色器对象的程序
     unsigned int vfProgram = glCreateProgram();
     //把之前编译的着色器附加到程序对象上,然后用glLinkProgram链接它们
     glAttachShader(vfProgram, vShader);
     glAttachShader(vfProgram, fShader);
     glLinkProgram(vfProgram);
     //返回连接好的着色器程序
     return vfProgram;
 }
 int main()
 {
     if (!glfwInit())
         exit(EXIT_FAILURE);
     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
     GLFWwindow* window = glfwCreateWindow(600, 600, "Hello, world", nullptr, nullptr);
     glfwMakeContextCurrent(window);
 ​
     if (glewInit() != GLEW_OK)
         exit(EXIT_FAILURE);
     glfwSwapInterval(1);
 ​
     init(window);
 ​
     while (!glfwWindowShouldClose(window))
     {
         display(window, glfwGetTime());
         glfwSwapBuffers(window);
         glfwPollEvents();
     }
 ​
     glfwDestroyWindow(window);
     glfwTerminate();
     exit(EXIT_SUCCESS);
 }

相关函数

参考:1.GLES2.0中文API-glShaderSource-CSDN博客等相关博客
1.glCreateShader - 创建一个着色器对象
C规范

GLuint glCreateShader(GLenum shaderType);

参数

shaderType

指定要创建的着色器的类型。 只能是GL_VERTEX_SHADERGL_FRAGMENT_SHADER

描述

glCreateShader创建一个空的着色器对象,并返回一个可以引用的非零值(shader ID)。着色器对象用于维护定义着色器的源代码字符串。shaderType指示要创建的着色器的类型。 支持两种类型的着色器。 GL_VERTEX_SHADER类型的着色器是一个用于在可编程顶点处理器上运行的着色器。 GL_FRAGMENT_SHADER类型的着色器是一个着色器,旨在在可编程片段处理器上运行。

创建时,着色器对象的GL_SHADER_TYPE参数设置为GL_VERTEX_SHADERGL_FRAGMENT_SHADER,具体取决于shaderType的值。

注意

与纹理对象一样,着色器对象的名称空间可以在一组上下文中共享,只要上下文的服务器端共享相同的地址空间即可。 如果名称空间跨上下文共享,则也会共享任何附加对象和与这些附加对象关联的数据。

当从不同的执行线程访问对象时,应用程序需要负责跨API调用提供同步。

错误

如果创建着色器对象时发生错误,则此函数返回0。

GL_INVALID_ENUMshaderType不是一个可接受的值。

2.glGetShaderSource - 从着色器对象返回源代码字符串
C规范

void glGetShaderSource( GLuint shader, GLsizei bufSize, GLsizei length*, GLchar source*);

参数

shader

指定要查询的着色器对象。

bufSize

指定用于存储返回的源代码字符串的字符缓冲区的大小。

length

返回source中返回的字符串的长度(不包括null终止符)。

source

指定用于返回源代码字符串的字符数组。

描述

glGetShaderSource返回由着色器指定的着色器对象的源代码字符串的串联。着色器对象的源代码字符串是先前调用glShaderSource的结果。函数返回的字符串将以null结尾。

glGetShaderSource尽可能多地在源代码中返回源代码字符串,最多可返回bufSize字符。实际返回的字符数(不包括空终止字符)由length指定。如果不需要返回字符串的长度,则可以在length参数中传递NULL值。可以通过调用值为GL_SHADER_SOURCE_LENGTH的glGetShaderiv来获取存储返回的源代码字符串所需的缓冲区大小。

错误

GL_INVALID_VALUEshader不是OpenGL生成的值。

GL_INVALID_OPERATIONshader不是着色器对象。

GL_INVALID_VALUEbufSize小于0。

3.glShaderSource-替换着色器对象中的源代码
C规范

void glShaderSource(GLuint shader,GLsizei count,const GLchar * const string*,const GLint length*);

参数

shader

要被替换源代码的着色器对象的句柄(ID)。

count

指定字符串和长度数组中的元素数。

string

指定指向包含要加载到着色器的源代码的字符串的指针数组。

length

指定字符串长度的数组。

描述

对于支持着色器编译器的实现,glShaderSource将着色器中的源代码设置为string指定的字符串数组中的源代码。先前存储在着色器对象中的任何源代码都将被完全替换。数组中的字符串数由count指定。 如果lengthNULL,则认为每个字符串都以null结尾。如果length不是NULL,则它指向包含字符串的每个相应元素的字符串长度的数组。length数组中的每个元素可以包含相应字符串的长度(空字符不计为字符串长度的一部分)或小于0的值以表示该字符串为空终止。此时不扫描或解析源代码字符串; 它们只是复制到指定的着色器对象中。

注意

着色器编译器支持是可选的,因此必须在使用之前通过使用参数GL_SHADER_COMPILER调用glGet来查询。glShaderSource,glCompileShaderglGetShaderPrecisionFormatglReleaseShaderCompiler等在不支持着色器编译器的实现上都将生成GL_INVALID_OPERATION。这样的实现提供了glShaderBinary替代方案,用于提供预编译的着色器二进制文件。

调用glShaderSource时,OpenGL会复制着色器源代码字符串,因此应用程序可以在函数返回后立即释放源代码字符串的副本。

错误

GL_INVALID_OPERATION:不支持着色器编译器

GL_INVALID_VALUEshader不是OpenGL生成的值

GL_INVALID_OPERATIONshader不是着色器对象

GL_INVALID_VALUEcount比0小

4.glCompileShader - 编译一个着色器对象
C规范

void glCompileShader(GLuint shader);

参数

shader

指定要编译的着色器对象。

描述

对于支持着色器编译器的实现,glCompileShader编译已存储在shader指定的着色器对象中的源代码字符串。

编译状态将存储为着色器对象的状态的一部分。 如果着色器编译时没有错误并且可以使用,则此值将设置为GL_TRUE,否则将设置为GL_FALSE。 可以通过使用参数shaderGL_COMPILE_STATUS调用glGetShaderiv来查询状态值。

由于OpenGL ES着色语言规范指定的多种原因,着色器的编译可能会失败。 无论编译是否成功,都可以通过调用glGetShaderInfoLog从着色器对象的信息日志中获取有关编译的信息。

注意

着色器编译器支持是可选的,因此必须在使用之前通过使用参数GL_SHADER_COMPILER调用glGet来查询。glShaderSource,glCompileShaderglGetShaderPrecisionFormatglReleaseShaderCompiler等在不支持着色器编译器的实现上都将生成GL_INVALID_OPERATION。这样的实现提供了glShaderBinary替代方案,用于提供预编译的着色器二进制文件。

错误

GL_INVALID_OPERATION:不支持着色器编译器

GL_INVALID_VALUEshader不是OpenGL生成的值

GL_INVALID_OPERATIONshader不是着色器对象

5.glCreateProgram- 创建一个program(建议不要翻译成“程序”,以免引起与APP的混淆)对象
C规范

GLuint glCreateProgram(void);

描述

glCreateProgram创建一个空program并返回一个可以被引用的非零值(program ID)。 program对象是可以附加着色器对象的对象。 这提供了一种机制来指定将链接已创建program的着色器对象。 它还提供了一种检查将用于创建program的着色器的兼容性的方法(例如,检查顶点着色器和片元着色器之间的兼容性)。 当不再需要作为program对象的一部分时,着色器对象就可以被分离了。

通过调用glCompileShader成功编译着色器对象,并且通过调用glAttachShader成功地将着色器对象附加到program 对象,并且通过调用glLinkProgram成功的链接program 对象之后,可以在program 对象中创建一个或多个可执行文件。

当调用glUseProgram时,这些可执行文件成为当前状态的一部分。 可以通过调用glDeleteProgram删除程序对象。 当program 对象不再是任何上下文的当前呈现状态的一部分时,将删除与program 对象关联的内存。

注意

与纹理对象一样,只要上下文的服务器端共享相同的地址空间,程序对象的名称空间就可以在一组上下文中共享。 如果名称空间跨上下文共享,则也会共享任何附加对象和与这些附加对象关联的数据。

当从不同的执行线程访问对象时,应用程序负责跨API调用提供同步。

错误

如果创建program 对象时发生错误,则此函数返回0。

6.glGenVertexArrays —生成顶点数组对象名称
C规范

void glGenVertexArrays(GLsizei n, GLuint *arrays);

参数

n 指定要生成的顶点数组对象名称的数量。

arrays 指定一个数组,在其中存储生成的顶点数组对象名称。

描述

glGenVertexArrays返回数组中的n个顶点数组对象名称。 不能保证名称形成连续的整数集。 但是,可以保证在调用glGenVertexArrays之前,不会立即使用任何返回的名称。

调用glGenVertexArrays返回的顶点数组对象名称不会被后续调用返回,除非首先使用glDeleteVertexArrays删除它们。

仅出于glGenVertexArrays的目的,将数组中返回的名称标记为已使用,但仅在首次绑定时才获取状态和类型。

错误

如果n为负,则生成GL_INVALID_VALUE。

7.glBindVertexArray — 绑定一个顶点数组对象
C规范

void glBindVertexArray( GLuint array);

参数

array 指定要绑定的顶点数组的名称。

描述

glBindVertexArray将顶点数组对象与名称数组绑定。 array是先前从glGenVertexArrays调用返回的顶点数组对象的名称,或者为0以绑定默认的顶点数组对象绑定。

如果不存在名称为array的顶点数组对象,则在第一次绑定array时创建一个对象。 如果绑定成功,则不会更改顶点数组对象的状态,并且任何先前的顶点数组对象绑定都会中断。

错误

如果array不为零或先前从调用glGenVertexArrays返回的顶点数组对象的名称,则生成GL_INVALID_OPERATION。

运行结果:

image-20231124144640906

在这GLuint是OpenGL中的数据类型,表示的就是无符号整数,所以我用unsigned int。

  1. #define numVAOs 1:这行代码定义了一个宏numVAOs,并将其值设置为1。这是为了在后面的代码中使用这个宏。

  2. unsigned int renderingProgram;:声明一个无符号整数类型的变量renderingProgram,用于存储渲染程序的ID。

  3. unsigned int vao[numVAOs];:声明一个无符号整数类型的数组vao,大小为numVAOs,用于存储顶点着色器程序的ID。

  4. unsigned int createShaderProgram():该函数用于创建一个渲染程序。

  5. const char* vshaderSource:用于存储顶点着色器的源代码。

  6. const char* fshaderSource:用于存储片段着色器的源代码。

  7. unsigned int vShader = glCreateShader(GL_VERTEX_SHADER);:调用OpenGL函数glCreateShader创建一个顶点着色器,并将其赋值给变量vShader

  8. unsigned int fShader = glCreateShader(GL_FRAGMENT_SHADER);:调用OpenGL函数glCreateShader创建一个片段着色器,并将其赋值给变量fShader

  9. glShaderSource(vShader, 1, &vShaderSource, NULL);:调用OpenGL函数glShaderSource将顶点着色器的源代码传递给顶点着色器。

  10. glShaderSource(fShader, 1, &fShaderSource, NULL);:调用OpenGL函数glShaderSource将片段着色器的源代码传递给片段着色器。

  11. glCompileShader(vShader);:调用OpenGL函数glCompileShader编译顶点着色器。

  12. glCompileShader(fShader);:调用OpenGL函数glCompileShader编译片段着色器。

  13. unsigned int vfProgram = glCreateProgram();:调用OpenGL函数glCreateProgram创建一个渲染程序,并将其赋值给变量vfProgram

  14. glAttachShader(vfProgram, vShader);:调用OpenGL函数glAttachShader将顶点着色器添加到渲染程序中。

  15. glAttachShader(vfProgram, fShader);:调用OpenGL函数glAttachShader将片段着色器添加到渲染程序中。

  16. glLinkProgram(vfProgram);:调用OpenGL函数glLinkProgram链接渲染程序。

  17. glGenVertexArrays(numVAOs, vao);:调用OpenGL函数glGenVertexArrays创建一个顶点着色器数组,并将其赋值给变量vao[0]

  18. glBindVertexArray(vao[0]);:调用OpenGL函数glBindVertexArray将顶点着色器数组绑定到当前的渲染程序中。

在片段着色器中同样有一个变量能让我们访问输入片段的坐标,叫作gl_FragCoord。让我们来使用它基于位置来设置每个像素的值。

 const char* fShaderSource =
         "#version 430 \n"
         "out vec4 color; \n"
         "void main(void) \n"
         "{ if(gl_FragCoord.x < 255) color = vec4(1.0, 0.0, 0.0, 1.0); else color = vec4(0.0, 0.0, 1.0, 1.0);}";     

同时我们需要将该点设置得更大一点。

 glPointSize(430.0f);

运行结果:

image-20231124145929558

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenGL ES 3.0 英文版 第1章——OpenGL ES 3.0简介   第1章简单介绍OpenGL ES,概述了OpenGL ES 3.0图形管线,讨论了OpenGL ES 3.0的设计理念和限制,最后介绍了OpenGL ES 3.0中使用的一些约定和类型。   第2章——你好,三角形:一个OpenGL ES 3.0示例   第2章介绍绘制三角形的一个简单OpenGL ES 3.0示例。我们的目的是说明OpenGL ES 3.0程序的样子,向读者介绍一些API概念,并说明如何构建和运行OpenGL ES 3.0示例程序。   第3章——EGL简介   第3章介绍EGL——为OpenGL ES 3.0创建表面和渲染上下文的API。我们说明与原生窗口系统通信、选择配置和创建EGL渲染上下文及表面的方法,传授足够多的EGL知识,你可以了解到启动OpenGL ES 3.0进行渲染所需的所有知识。   第4章——着色器和程序   着色器对象和程序对象是OpenGL ES 3.0中最基本的对象。第4章介绍创建着色器对象、编译着色器和检查编译错误的方法。这一章还说明如何创建程序对象、将着色器对象连接到程序对象以及链接最终程序对象的方法。我们讨论如何查询程序对象的信息以及加载统一变量(uniform)的方法。此外,你将学习有关源着色器和程序二进制代码之间的差别以及它们的使用方法。   第5章——OpenGL ES着色语言   第5章介绍编写着色器所需的着色语言的基础知识。这些着色语言基础知识包括变量和类型、构造器、结构、数组、统一变量、统一变量块(uniform block)和输入/输出变量。该章还描述着色语言的某些更细微的部分,例如精度限定符和不变性。   第6章——顶点属性、顶点数组和缓冲区对象   从第6章开始(到第11章为止),我们将详细介绍管线,教授设置和编程图形管线各个部分的方法。这一旅程从介绍几何形状输入图形管线的方法开始,包含了对顶点属性、顶点数组和缓冲区对象的讨论。   第7章——图元装配和光栅化   在前一章讨论几何形状输入图形管线的方法之后,第7章将讨论几何形状如何装配成图元,介绍OpenGL ES 3.0中所有可用的图元类型,包括点精灵、直线、三角形、三角形条带和三角扇形。此外,我们还说明了在顶点上进行坐标变换的方法,并简单介绍了OpenGL ES 3.0管线的光栅化阶段。   第8章——顶点着色器   我们所介绍的管线的下一部分是顶点着色器。第8章概述了顶点着色器如何融入管线以及OpenGL ES 着色语言中可用于顶点着色器的特殊变量,介绍了多个顶点着色器的示例,包括逐像素照明和蒙皮(skinning)。我们还给出了用顶点着色器实现OpenGL ES 1.0(和1.1)固定功能管线的示例。   第9章——纹理   第9章开始介绍片段着色器,描述OpenGL ES 3.0中所有可用的纹理功能。该章提供了创建纹理、加载纹理数据以及纹理渲染的细节,描述了纹理包装模式、纹理过滤、纹理格式、压缩纹理、采样器对象、不可变纹理、像素解包缓冲区对象和Mip贴图。该章介绍了OpenGL ES 3.0支持的所有纹理类型:2D纹理、立方图、2D纹理数组和3D纹理。   第10章——片段着色器   第9章的重点是如何在片段着色器中使用纹理,第10章介绍编写片段着色器所需知道的其他知识。该章概述了片段着色器和所有可用的特殊内建变量,还演示了用片段着色器实现OpenGL ES 1.1中所有固定功能技术的方法。多重纹理、雾化、Alpha测试和用户裁剪平面的例子都使用片段着色器实现。   第11章——片段操作   第11章讨论可以适用于整个帧缓冲区或者在OpenGL ES 3.0片段管线中执行片段着色器后适用于单个片段的操作。这些操作包括剪裁测试、模板测试、深度测试、多重采样、混合和抖动。本章介绍OpenGL ES 3.0图形管线的最后阶段。   第12章——帧缓冲区对象   第12章讨论使用帧缓冲区对象渲染屏幕外表面。帧缓冲区对象有多种用法,最常见的是渲染到一个纹理。本章提供API帧缓冲区对象部分的完整概述。理解帧缓冲区对象对于实现许多高级特效(如反射、阴影贴图和后处理)至关重要。   第13章——同步对象和栅栏   第13章概述同步对象和栅栏,它们是在OpenGL ES 3.0主机应用和GPU执行中同步的有效图元。我们讨论同步对象和栅栏的使用方法,并以一个示例作为结束。   第14章——OpenGL ES 3.0高级编程   第14章是核心章节,将本书介绍的许多主题串联在一起。我们已经选择了高级渲染技术的一个样本,并展示了实现这些功能的示例。该章包含使用法线贴图的逐像素照明、环境贴图、粒子系统、图像后处理、程序纹理、阴影贴图、地形渲染
前言 第1章OpenGL简介 1.1什么是OpenGL? 1.2一段简单的OpenGL代码 1.3OpenGL函数的语法 1.4OpenGL是个状态机 1.5OpenGL渲染管线 1.5.1显示列表 1.5.2求值器 1.5.3基于顶点的操作 1.5.4图元装配 1.5.5像素操作 1.5.6纹理装配 1.5.7光栅化 1.5.8片断操作 1.6与OpenGL相关的函数库 1.6.1包含文件 1.6.2GLUT,OpenGL实用工具包 1.7动画 1.7.1暂停刷新 1.7.2动画=重绘+交换 第2章状态管理和绘制几何物体 2.1绘图工具箱 2.1.1清除窗口 2.1.2指定颜色 2.1.3强制完成绘图操作 2.1.4坐标系统工具箱 2.2描述点、直线和多边形 2.2.1什么是点、直线和多边形? 2.2.2指定顶点 2.2.3OpenGL几何图元 2.3基本状态管理 2.4显示点、直线和多边形 2.4.1点的细节 2.4.2直线的细节 2.4.3多边形的细节 2.5法线向量 2.6顶点数组 2.6.1步骤1:启用数组 2.6.2步骤2:指定数组的数据 2.6.3步骤3:解引用和渲染 2.7缓冲区对象 2.7.1创建缓冲区对象 2.7.2激活缓冲区对象 2.7.3用数据分配和初始化缓冲区对象 2.7.4更新缓冲区对象的数据值 2.7.5清除缓冲区对象 2.7.6使用缓冲区对象存储顶点数据数据 2.8属性组 2.9关于创建多边形表面模型的一些提示 2.9.1例子:创建一个二十面体 第3章视图 3.1简介:照相机比喻 3.2.1一个简单的例子:绘制立方体 3.1.2通用的变换函数 3.2视图和模型变换 3.2.1对变换进行思考 3.2.2模型变换 3.2.3视图变换 3.3投影变换 3.3.1透视投影 …… 第4章颜色 第5章光照 第6章混合、抗锯齿、雾和多边形偏移 第7章显示列表 第8章绘制像素、位图、字体和图像 第9章纹理贴图 第10章帧缓冲区 第11章分格化和二次方程表面 第12章求值器和NURBS 第13章选择和反馈 第14章OpenGL高级技巧 第15章OpenGL着色语言 附录A操作顺序 附录B状态变量 附录COpenGL和窗口系统 附录DGLUT(OpenGL实用工具库)基础知识 附录E计算法线向量 附录F齐次坐标和变换矩阵 附录G编程提示 附录HOpenGL的不变性规则 附录IOpenGL着色语言内置的变量和函数 术语表
由资深OpenGL技术专家亲笔撰写,全面介绍OpenGL ES 3.0的各种特性及新增功能,通过大量已经编译和测试过的实例,详细讲解OpenGL ES 3.0中的应用程序接口(API)和图形管线,既涵盖简单图形的渲染方法,又深入介绍逐像素照明和粒子系统等高级渲染技术,并且包含大量有效使用API和硬件的实用技巧,为手持设备的各种高性能3D应用开发提供翔实指导。 《华章 OpenGL ES 3.0编程指南(原书第2版)》共16章:第1章简单介绍OpenGL ES ,并概述OpenGL ES 3.0图形管线;第2章通过绘制一个三角形的简单OpenGL ES 3.0示例程序,讲解一些API概念,并说明如何构建和运行OpenGL ES示例程序;第3章讲述为OpenGL ES 3.0创建表面和渲染上下文的API——EGL;第4章讨论创建着色器对象、编译着色器和检查编译错误的方法;第5章讲解编写着色器所需的着色语言基本知识;第6章详细介绍几何形状输入图形管线的方法,包含对顶点属性、顶点数组和缓冲区对象的讨论;第7章讨论几何形状如何装配成图元,介绍OpenGL ES 3.0中所有可用图元类型,包括点精灵、直线、三角形、三角形条带和三角扇形;第8章概述顶点着色器如何融入管线,以及OpenGL ES 着色语言中可用于顶点着色器的特殊变量;第9章和第10章介绍片段着色器,包括多重纹理、雾化、Alpha测试和用户裁剪平面等;第11章讨论片段操作,包括剪裁测试、模板测试、深度测试、多重采样、混合和抖动;第12章介绍使用帧缓冲区对象渲染屏幕外表面;第13章讨论同步对象和栅栏的使用方法;第14章介绍OpenGL ES 3.0高级编程,包含使用法线贴图的逐像素照明、环境贴图、粒子系统、图像后处理、程序纹理、阴影贴图、地形渲染和投影纹理等渲染技术。;第15章提供OpenGL ES 3.0中各种可用状态查询的参考;第16章讨论如何为iOS 7、Android 4.3 NDK、Android 4.3 SDK、Windows和Linux构建OpenGL ES样板代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值