掌握OpenGL绝技,从零开始的详细教程!

作者:兰州淘贝游戏开发公司 阅读:79 次 发布时间:2023-05-31 04:22:35

摘要:OpenGL是一款跨平台的图形渲染API,广泛用于游戏开发、建筑设计、工业仿真、科学研究等领域。如果你想在计算机图形方面有所建树,掌握OpenGL必不可少。本文将为您提供一份从零开始的OpenGL教程,帮助您快速掌握OpenGL的基础知识和绝技。1. 安装OpenGL首先,要使用OpenGL,需要...

OpenGL是一款跨平台的图形渲染API,广泛用于游戏开发、建筑设计、工业仿真、科学研究等领域。如果你想在计算机图形方面有所建树,掌握OpenGL必不可少。本文将为您提供一份从零开始的OpenGL教程,帮助您快速掌握OpenGL的基础知识和绝技。

掌握OpenGL绝技,从零开始的详细教程!

1. 安装OpenGL

首先,要使用OpenGL,需要在计算机上安装OpenGL开发环境。一般来说,安装OpenGL需要完成以下几个步骤:

1.1安装OpenGL的SDK和库文件:可以从OpenGL官网(https://www.opengl.org/)上下载安装包,然后根据提示进行安装。

1.2设置IDE:编程中需要用到IDE(集成开发环境),如Visual Studio、Eclipse等。

1.3添加库文件:将OpenGL库文件添加到IDE中,以便在编写代码时调用。

2.学习OpenGL基础知识

在理解OpenGL的基础知识之前,必须先了解OpenGL的结构和概念:

OpenGL是由状态机作为基础的,每一个状态都有自己的属性,包括可见性、颜色、位置等。OpenGL的工作方式是从状态机设定的状态开始,根据API调用逐步修改状态,最终显示在屏幕上。

OpenGL的主要术语包括:

顶点(Vertex):指在三维坐标系中定义的点。

三角形(Triangle):通过顶点之间连接和填充颜色、纹理形成的三角形。

渲染(Rendering):指将图形或图像可视化的过程。

着色器(Shader):允许程序员以自定义方式计算每个像素的颜色。

VAO(Vertex Array Object):用于存储所有渲染数据的容器。

VBO(Vertex Buffer Object):储存一组由OpenGL渲染的一系列“点”。

3.创建第一个OpenGL程序

学习了OpenGL基础知识后,我们来创建一个简单的OpenGL程序。

步骤:

3.1 新建工程。

3.2 建立OpenGL窗口。

3.3 渲染窗口。

详细代码如下:

```

#include

void OnDisplay() {

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

glClear(GL_COLOR_BUFFER_BIT);

glutSwapBuffers();

}

int main(int argc, char** argv) {

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_DOUBLE);

glutInitWindowSize(800, 600);

glutCreateWindow("My First OpenGL Window");

glutDisplayFunc(OnDisplay);

glutMainLoop();

return 0;

}

```

以上代码演示了如何使用OpenGL创建一个最基础的窗口。其中:

glClearColor()的作用是设置清屏颜色;

glClear()的作用是清除缓存数据;

glutSwapBuffers()的作用是展示渲染结果;

glutDisplayFunc()是OpenGL调用渲染函数的函数。

4.创建一个矩形

了解了如何创建OpenGL的窗口之后,接下来,我们创建一个矩形来更好地理解OpenGL。

步骤:

4.1 创建一个VAO对象。

4.2 创建一个VBO对象。

4.3 绑定VAO。

4.4 把VBO数据传给GPU。

4.5 编写着色器。

4.6 绘制矩形。

详细代码如下:

```

#include

#include

const GLfloat vVerts[] = {

0.0f, 0.5f, 0.0f,

-0.5f, -0.5f, 0.0f,

0.5f, -0.5f, 0.0f

};

GLuint VBO, VAO;

//顶点着色器

const char* vertexShaderSource =

"#version 330 core\n"

"layout (location = 0) in vec3 aPos;"

"void main() {"

" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);"

"}";

//片段着色器

const char* fragmentShaderSource =

"#version 330 core\n"

"out vec4 FragColor;"

"void main() {"

" FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);"

"}";

void OnDisplay() {

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

glClear(GL_COLOR_BUFFER_BIT);

glUseProgram(shaderProgram);

glBindVertexArray(VAO);

glDrawArrays(GL_TRIANGLES, 0, 3);

glBindVertexArray(0);

glutSwapBuffers();

}

void OnCreate() {

glGenVertexArrays(1, &VAO); //生成VAO

glGenBuffers(1, &VBO); //生成VBO

glBindVertexArray(VAO);

glBindBuffer(GL_ARRAY_BUFFER, VBO);

glBufferData(GL_ARRAY_BUFFER, sizeof(vVerts), vVerts, GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);

glEnableVertexAttribArray(0);

glBindBuffer(GL_ARRAY_BUFFER, 0);

glBindVertexArray(0);

//编译着色器

GLint success;

GLchar infoLog[512];

GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);

glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);

glCompileShader(vertexShader);

glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);

if (!success) {

glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);

std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;

}

GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);

glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);

glCompileShader(fragmentShader);

glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);

if (!success) {

glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);

std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;

}

GLuint shaderProgram = glCreateProgram();

glAttachShader(shaderProgram, vertexShader);

glAttachShader(shaderProgram, fragmentShader);

glLinkProgram(shaderProgram);

glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);

if (!success) {

glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);

std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;

}

glDeleteShader(vertexShader);

glDeleteShader(fragmentShader);

}

int main(int argc, char** argv) {

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_DOUBLE);

glutInitWindowSize(800, 600);

glutCreateWindow("OpenGL rectangle");

glewExperimental = GL_TRUE; //GLEW

glewInit(); //Initialize GLEW

OnCreate();

glutDisplayFunc(OnDisplay);

glutMainLoop();

return 0;

}

```

以上代码演示了如何创建一个矩形,并将其渲染出来。其中:

创建VAO和VBO:在初始化OpenGL时,需要为我们的图形创建一个VertexArrayObject和一个VertexBufferObject。

绑定:绑定VAO和VBO,以便我们将图形数据传输给OpenGL。

编写着色器:通常,一个着色器程序有多个着色器,顶点着色器和片段着色器是最基本的着色器。顶点着色器 takes in an array of vertices(接受一个顶点数组),然后将它们转换为代码中的对象。然后,它输出一个vec4变量,其中w设置为1.0,用于坐标变换所需的齐次坐标。与之相反,片段着色器将像素颜色计算为输入所需的颜色。

绘制矩形:最后,需要渲染这个矩形,使用glDrawArrays()函数。

5.总结

本文介绍了如何从零开始创建OpenGL应用程序。我们覆盖了OpenGL的基本结构和概念,学习创建窗口和绘制几何图形。OpenGL是一个庞大的框架,具有强大的实用性和优秀的性能。通过本文所提供的基础教程,希望能帮助读者更快地了解OpenGL,并掌握绝技。

  • 原标题:掌握OpenGL绝技,从零开始的详细教程!

  • 本文链接:https://qipaikaifa1.com/jsbk/8361.html

  • 本文由兰州淘贝游戏开发公司小编,整理排版发布,转载请注明出处。部分文章图片来源于网络,如有侵权,请与淘贝科技联系删除。
  • 微信二维码

    CTAPP999

    长按复制微信号,添加好友

    微信联系

    在线咨询

    点击这里给我发消息QQ客服专员


    点击这里给我发消息电话客服专员


    在线咨询

    免费通话


    24h咨询☎️:189-2934-0276


    🔺🔺 棋牌游戏开发24H咨询电话 🔺🔺

    免费通话
    返回顶部