主程序示例OpenGL与GLUT中的网格坐标
在OpenGL和GLUT中,使用网格坐标可以帮助我们更好地理解和操作图形。下面是一个简单的示例代码,展示了如何在OpenGL和GLUT中使用网格坐标来绘制简单的3D场景。
首先,我们需要定义一个简单的顶点结构体,用于存储每个顶点的坐标、颜色和其他属性:
```cpp
typedef struct {
float x, y, z; // 坐标
float r, g, b; // RGB颜色值
} Vertex;
```
接下来,我们可以创建一个向量数组来存储所有的顶点。在这个示例中,我们将绘制一个简单的立方体:
```cpp
Vertex vertices[] = {
{ -1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f }, // 前左上顶点
{ -1.0f, -1.0f, 1.0f, 0.0f, 1.0f, 0.0f }, // 前左下顶点
{ 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 0.0f }, // 前右上顶点
{ 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f }, // 前右下顶点
{ -1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 0.0f }, // 后左上顶点
{ -1.0f, -1.0f, -1.0f, 0.0f, 1.0f, 0.0f }, // 后左下顶点
{ 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 0.0f }, // 后右上顶点
{ 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f } // 后右下顶点
};
```
然后,我们需要定义一个简单的着色器程序。在这个示例中,我们将使用GLSL编写一个简单的着色器程序来计算每个顶点的颜色:
```cpp
#version 330 core
in vec3 inPosition; // 输入的顶点坐标
out vec4 fragColor; // 输出的片段颜色
uniform mat4 model; // 模型矩阵
uniform mat4 view; // 视图矩阵
uniform mat4 projection; // 投影矩阵
void main() {
gl_Position = projection * view * model * vec4(inPosition, 1.0);
fragColor = vec4(0.5f, 0.5f, 0.5f, 1.0f);
}
```
最后,我们可以使用GLUT来创建一个窗口并渲染我们的场景。在这个示例中,我们将绘制一个简单的立方体:
```cpp
glutInit();
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
int width = 640, height = 480;
// 创建窗口
int window = glutCreateWindow("OpenGL - Grid Coordinates");
// 设置投影矩阵和模型矩阵
float aspectRatio = (float)width / height;
mat4 projectionMatrix = perspective(45.0f * DEG_TO_RAD, aspectRatio, 1.0f, 100.0f);
mat4 modelMatrix = translate(mat4(1.0f), vec3(width/2.0f, -height/2.0f, -10)); // 将立方体移动到屏幕中心并置于背景平面之后
// 设置视图矩阵和投影矩阵的统一变量
glUniformMatrix4fv(uniformLocation("model"), 1, GL_FALSE, glm::value_ptr(modelMatrix));
glUniformMatrix4fv(uniformLocation("view"), 1, GL_FALSE, glm::value_ptr(camera.viewMatrix()));
// 渲染场景
while (glutGetError() == GL_NO_ERROR) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(program); // 使用着色器程序
for (int i = 0; i < ARRAYSIZE> // 将顶点坐标传递给着色器程序
glVertexAttrib3f(attribLocation("inPosition"), vertices[i].x, vertices[i].y, vertices[i].z);
glDrawArrays(GL_TRIANGLES, i * 6 + 0, 4); // 绘制前侧面
glDrawArrays(GL_TRIANGLES, i * 6 + 1, 2); // 绘制顶面
}
glutSwapBuffers();
glutPostRedisplay();
}
```
在这个示例中,我们使用了GLUT来创建一个窗口并渲染我们的场景。我们使用OpenGL和GLSL编写了一个简单的着色器程序来计算每个顶点的颜色,并将顶点坐标传递给着色器程序进行处理。最后,我们使用GLUT的glutSwapBuffers()函数来交换缓冲区,并在屏幕上显示渲染结果。
首先,我们需要定义一个简单的顶点结构体,用于存储每个顶点的坐标、颜色和其他属性:
```cpp
typedef struct {
float x, y, z; // 坐标
float r, g, b; // RGB颜色值
} Vertex;
```
接下来,我们可以创建一个向量数组来存储所有的顶点。在这个示例中,我们将绘制一个简单的立方体:
```cpp
Vertex vertices[] = {
{ -1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f }, // 前左上顶点
{ -1.0f, -1.0f, 1.0f, 0.0f, 1.0f, 0.0f }, // 前左下顶点
{ 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 0.0f }, // 前右上顶点
{ 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f }, // 前右下顶点
{ -1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 0.0f }, // 后左上顶点
{ -1.0f, -1.0f, -1.0f, 0.0f, 1.0f, 0.0f }, // 后左下顶点
{ 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 0.0f }, // 后右上顶点
{ 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f } // 后右下顶点
};
```
然后,我们需要定义一个简单的着色器程序。在这个示例中,我们将使用GLSL编写一个简单的着色器程序来计算每个顶点的颜色:
```cpp
#version 330 core
in vec3 inPosition; // 输入的顶点坐标
out vec4 fragColor; // 输出的片段颜色
uniform mat4 model; // 模型矩阵
uniform mat4 view; // 视图矩阵
uniform mat4 projection; // 投影矩阵
void main() {
gl_Position = projection * view * model * vec4(inPosition, 1.0);
fragColor = vec4(0.5f, 0.5f, 0.5f, 1.0f);
}
```
最后,我们可以使用GLUT来创建一个窗口并渲染我们的场景。在这个示例中,我们将绘制一个简单的立方体:
```cpp
glutInit();
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
int width = 640, height = 480;
// 创建窗口
int window = glutCreateWindow("OpenGL - Grid Coordinates");
// 设置投影矩阵和模型矩阵
float aspectRatio = (float)width / height;
mat4 projectionMatrix = perspective(45.0f * DEG_TO_RAD, aspectRatio, 1.0f, 100.0f);
mat4 modelMatrix = translate(mat4(1.0f), vec3(width/2.0f, -height/2.0f, -10)); // 将立方体移动到屏幕中心并置于背景平面之后
// 设置视图矩阵和投影矩阵的统一变量
glUniformMatrix4fv(uniformLocation("model"), 1, GL_FALSE, glm::value_ptr(modelMatrix));
glUniformMatrix4fv(uniformLocation("view"), 1, GL_FALSE, glm::value_ptr(camera.viewMatrix()));
// 渲染场景
while (glutGetError() == GL_NO_ERROR) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(program); // 使用着色器程序
for (int i = 0; i < ARRAYSIZE> // 将顶点坐标传递给着色器程序
glVertexAttrib3f(attribLocation("inPosition"), vertices[i].x, vertices[i].y, vertices[i].z);
glDrawArrays(GL_TRIANGLES, i * 6 + 0, 4); // 绘制前侧面
glDrawArrays(GL_TRIANGLES, i * 6 + 1, 2); // 绘制顶面
}
glutSwapBuffers();
glutPostRedisplay();
}
```
在这个示例中,我们使用了GLUT来创建一个窗口并渲染我们的场景。我们使用OpenGL和GLSL编写了一个简单的着色器程序来计算每个顶点的颜色,并将顶点坐标传递给着色器程序进行处理。最后,我们使用GLUT的glutSwapBuffers()函数来交换缓冲区,并在屏幕上显示渲染结果。
4.6KB
文件大小:
评论区