Opengl实验报告及源代码实验三 着色器编程

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档