Opengl实验报告及源代码实验三 着色器编程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
学生姓名:学号:专业班级:
实验类型:□验证□综合□设计□创新实验日期:2018.11 实验成绩:
一、实验名称
实验三着色器编程
二、实验内容
1.利用OpenGL的顶点数组对象、顶点缓冲对象和索引缓冲对象组织图元数据,设
置图元属性,进行核心模式的图元渲染。
2.编写顶点着色器、片段着色器代码,进行代码的编译和链接形成着色器程序,采
用核心模式绘制OpenGL几何图元。
3.采用文件形式保存着色器代码,编写着色器类,在着色器类中实现着色器代码的
加载、编译和链接。
三、实验目的
1.掌握顶点数组对象、顶点缓冲对象和索引缓冲对象的创建、数据缓存、属性设置
和绑定方法。
2.掌握顶点着色器和片段着色器的定义、代码加载、程序编译方法,着色器程序的
定义、链接和使用方法。
3.掌握如何采用面向对象方法封装着色器的代码加载、程序编译方法和链接方法。
四、实验步骤
1.新建项目OPengl02,在项目下添加opengl0
2.cpp文件和glad.c文件;
2.在opengl02.cpp文件中,添加代码:
(1)定义几何图元的顶点数据和索引数据
GLfloat vertices[] = {
0.5f, 0.5f, 0.0f, // Top Right
0.5f, -0.5f, 0.0f, // Bottom Right
-0.5f, -0.5f, 0.0f, // Bottom Left
-0.5f, 0.5f, 0.0f // Top Left
};
GLuint indices[] = { // Note that we start from 0!
0, 1, 3, // First Triangle
1, 2, 3 // Second Triangle
};
(2)创建顶点数组对象、顶点缓冲对象和索引缓冲对象,绑定相关对象,缓存数据、设置顶点属性。
GLuint VBO, VAO, EBO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glGenBuffers(1, &EBO);
// Bind the Vertex Array Object first, then bind and set vertex buffer(s) and attribute pointer(s).
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
// Note that this is allowed, the call to glVertexAttribPointer registered VBO as the
currently bound vertex buffer object so afterwards we can safely unbind
glBindVertexArray(0);
// Unbind VAO (it's always a good thing to unbind any buffer/array to prevent strange bugs), remember: do NOT unbind the EBO, keep it bound to this VAO
(3)编写顶点着色器、片段着色器代码。
const GLchar* vertexShaderSource = "#version 330 core\n"
"layout (location = 0) in vec3 position;\n"
"void main()\n"
"{\n"
"gl_Position = vec4(position.x, position.y, position.z, 1.0);\n"
"}\0";
const GLchar* fragmentShaderSource = "#version 330 core\n"
"out vec4 color;\n"
"void main()\n"
"{\n"
"color = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"
"}\n\0";
(4)加载着色器代码,进行代码的编译和链接形成着色器程序
// Build and compile our shader program
// Vertex shader
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);
// Check for compile time errors
GLint success;