顶点着色器是图形渲染管线中的一个重要组成部分,用于处理输入的顶点数据并将其转换为屏幕空间中的坐标。以下是顶点着色器的完整攻略,包含两个示例说明。
什么是顶点着色器?
顶点着色器是图形渲染管线中的一个阶段,用于处理输入的顶点数据并将其转换为屏幕空间中的坐标。它是在GPU上执行的程序,可以通过编写着色器代码来控制顶点的位置、颜色、法线等属性。
如何编写顶点着色器?
以下是编写顶点着色器的步骤:
- 创建一个新的着色器程序对象。
c++
GLuint shaderProgram = glCreateProgram();
- 创建一个新的顶点着色器对象。
c++
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
- 编写顶点着色器代码。
```c++
#version 330 core
layout (location = 0) in vec3 position;
void main()
{
gl_Position = vec4(position.x, position.y, position.z, 1.0);
}
```
以上代码将输入的顶点位置向量转换为齐次坐标,并将其赋值给内置变量gl_Position
。
- 将顶点着色器代码附加到着色器对象上。
c++
const char* vertexShaderSource = "..."; // 顶点着色器代码
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
- 编译顶点着色器。
c++
glCompileShader(vertexShader);
- 将顶点着色器对象附加到着色器程序对象上。
c++
glAttachShader(shaderProgram, vertexShader);
- 链接着色器程序对象。
c++
glLinkProgram(shaderProgram);
- 使用着色器程序对象。
c++
glUseProgram(shaderProgram);
示例1:使用顶点着色器绘制三角形
以下是使用顶点着色器绘制三角形的步骤:
- 创建一个新的着色器程序对象。
c++
GLuint shaderProgram = glCreateProgram();
- 创建一个新的顶点着色器对象。
c++
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
- 编写顶点着色器代码。
```c++
#version 330 core
layout (location = 0) in vec3 position;
void main()
{
gl_Position = vec4(position.x, position.y, position.z, 1.0);
}
```
- 将顶点着色器代码附加到着色器对象上。
c++
const char* vertexShaderSource = "..."; // 顶点着色器代码
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
- 编译顶点着色器。
c++
glCompileShader(vertexShader);
- 将顶点着色器对象附加到着色器程序对象上。
c++
glAttachShader(shaderProgram, vertexShader);
- 链接着色器程序对象。
c++
glLinkProgram(shaderProgram);
- 使用着色器程序对象。
c++
glUseProgram(shaderProgram);
- 定义三角形的顶点数据。
c++
GLfloat vertices[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};
-
创建一个新的顶点缓冲对象。
c++
GLuint VBO;
glGenBuffers(1, &VBO); -
将顶点数据复制到顶点缓冲对象中。
c++
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); -
定义顶点属性指针。
c++
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0); -
绘制三角形。
c++
glDrawArrays(GL_TRIANGLES, 0, 3);
示例2:使用顶点着色器绘制立方体
以下是使用顶点着色器绘制立方体的步骤:
- 创建一个新的着色器程序对象。
c++
GLuint shaderProgram = glCreateProgram();
- 创建一个新的顶点着色器对象。
c++
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
- 编写顶点着色器代码。
```c++
#version 330 core
layout (location = 0) in vec3 position;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
void main()
{
gl_Position = projection * view * model * vec4(position, 1.0);
}
```
以上代码将输入的顶点位置向量转换为齐次坐标,并将其乘以模型、视图和投影矩阵,最终将结果赋值给内置变量gl_Position
。
- 将顶点着色器代码附加到着色器对象上。
c++
const char* vertexShaderSource = "..."; // 顶点着色器代码
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
- 编译顶点着色器。
c++
glCompileShader(vertexShader);
- 将顶点着色器对象附加到着色器程序对象上。
c++
glAttachShader(shaderProgram, vertexShader);
- 链接着色器程序对象。
c++
glLinkProgram(shaderProgram);
- 使用着色器程序对象。
c++
glUseProgram(shaderProgram);
- 定义立方体的顶点数据。
c++
GLfloat vertices[] = {
// 前面
-0.5f, -0.5f, 0.5f,
0.5f, -0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
-0.5f, -0.5f, 0.5f,
// 后面
-0.5f, -0.5f, -0.5f,
-0.5f, 0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
0.5f, -0.5f, -0.5f,
-0.5f, -0.5f, -0.5f,
// 左面
-0.5f, 0.5f, 0.5f,
-0.5f, 0.5f, -0.5f,
-0.5f, -0.5f, -0.5f,
-0.5f, -0.5f, -0.5f,
-0.5f, -0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
// 右面
0.5f, 0.5f, 0.5f,
0.5f, -0.5f, 0.5f,
0.5f, -0.5f, -0.5f,
0.5f, -0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
0.5f, 0.5f, 0.5f,
// 上面
-0.5f, 0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
0.5f, 0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
-0.5f, 0.5f, -0.5f,
-0.5f, 0.5f, 0.5f,
// 下面
-0.5f, -0.5f, 0.5f,
-0.5f, -0.5f, -0.5f,
0.5f, -0.5f, -0.5f,
0.5f, -0.5f, -0.5f,
0.5f, -0.5f, 0.5f,
-0.5f, -0.5f, 0.5f
};
-
创建一个新的顶点缓冲对象。
c++
GLuint VBO;
glGenBuffers(1, &VBO); -
将顶点数据复制到顶点缓冲对象中。
c++
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); -
定义顶点属性指针。
c++
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0); -
定义模型、视图和投影矩阵。
```c++
glm::mat4 model;
glm::mat4 view;
glm::mat4 projection;model = glm::rotate(model, glm::radians(45.0f), glm::vec3(0.0f, 1.0f, 0.0f));
view = glm::translate(view, glm::vec3(0.0f, 0.0f, -3.0f));
projection = glm::perspective(glm::radians(45.0f), (GLfloat)width / (GLfloat)height, 0.1f, 100.0f);
``` -
将模型、视图和投影矩阵传递给顶点着色器。
```c++
GLuint modelLoc = glGetUniformLocation(shaderProgram, "model");
GLuint viewLoc = glGetUniformLocation(shaderProgram, "view");
GLuint projectionLoc = glGetUniformLocation(shaderProgram, "projection");glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));
glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));
glUniformMatrix4fv(projectionLoc, 1, GL_FALSE, glm::value_ptr(projection));
``` -
绘制立方体。
c++
glDrawArrays(GL_TRIANGLES, 0, 36);
这些步骤可以帮助您了解如何使用顶点着色器的完整攻略,并提供了两个示例说明。在实际使用中,您可以根据需要选择不同的顶点属性和矩阵变换,以满足您的需求。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:顶点着色器详解(vertexshaders) - Python技术站