当前位置:文档之家› Opengl实验报告及源代码实验三 着色器编程

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

实验报告学生姓名:学号:专业班级:实验类型:□验证□综合□设计□创新实验日期:2018.11 实验成绩:一、实验名称实验三着色器编程二、实验内容1.利用OpenGL的顶点数组对象、顶点缓冲对象和索引缓冲对象组织图元数据,设置图元属性,进行核心模式的图元渲染。

2.编写顶点着色器、片段着色器代码,进行代码的编译和链接形成着色器程序,采用核心模式绘制OpenGL几何图元。

3.采用文件形式保存着色器代码,编写着色器类,在着色器类中实现着色器代码的加载、编译和链接。

三、实验目的1.掌握顶点数组对象、顶点缓冲对象和索引缓冲对象的创建、数据缓存、属性设置和绑定方法。

2.掌握顶点着色器和片段着色器的定义、代码加载、程序编译方法,着色器程序的定义、链接和使用方法。

3.掌握如何采用面向对象方法封装着色器的代码加载、程序编译方法和链接方法。

四、实验步骤1.新建项目OPengl02,在项目下添加opengl02.cpp文件和glad.c文件;2.在opengl02.cpp文件中,添加代码:(1)定义几何图元的顶点数据和索引数据GLfloat vertices[] = {0.5f, 0.5f, 0.0f, // Top Right0.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 Triangle1, 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 thecurrently bound vertex buffer object so afterwards we can safely unbindglBindVertexArray(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 shaderGLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);glCompileShader(vertexShader);// Check for compile time errorsGLint success;GLchar infoLog[512];glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);if (!success){glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;}// Fragment shaderGLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);glCompileShader(fragmentShader);// Check for compile time errorsglGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);if (!success){glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;}// Link shadersGLuint shaderProgram = glCreateProgram();glAttachShader(shaderProgram, vertexShader);glAttachShader(shaderProgram, fragmentShader);glLinkProgram(shaderProgram);// Check for linking errorsglGetProgramiv(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);(5)采用核心模式绘制 OpenGL 几何图元loadShader();setupRC();while (!glfwWindowShouldClose(window)) {processInput(window);glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);glUseProgram(shaderProgram);glBindVertexArray(VAO);//glDrawArrays(GL_TRIANGLES, 0, 6);glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);glfwSwapBuffers(window);glfwPollEvents();}(6)定义着色器类。

#ifndef SHADER_H#define SHADER_H#include <glad/glad.h>class Shader{public:Shader(const GLchar* vertexPath, const GLchar* fragmentPath);void use();GLuint program;};#endif3.编译运行五、实验结果(1)目录结构(2)实验结果六、实验体会1.本次实验是学习OPenGL的着色器编程,通过实验我对VAO、VBO、EBO这些看上去相近的东西有了更深的了解,熟悉了他们的用途,并且知道它们的作用和绑定方法。

也深刻体会到了核心模式和立即模式的区别。

2.在实验过程中,比较难理解的是VAO,VBO的绑定顺序,而且要特别心细。

前两次没有成功就是因为把VAO和VBO的顺序写反了。

相关主题